Lines Matching refs:drv_data
152 int (*write)(struct driver_data *drv_data);
153 int (*read)(struct driver_data *drv_data);
154 irqreturn_t (*transfer_handler)(struct driver_data *drv_data);
171 int (*write)(struct driver_data *drv_data);
172 int (*read)(struct driver_data *drv_data);
178 static int flush(struct driver_data *drv_data) in flush() argument
182 void __iomem *reg = drv_data->ioaddr; in flush()
198 static int null_writer(struct driver_data *drv_data) in null_writer() argument
200 void __iomem *reg = drv_data->ioaddr; in null_writer()
201 u8 n_bytes = drv_data->n_bytes; in null_writer()
204 || (drv_data->tx == drv_data->tx_end)) in null_writer()
208 drv_data->tx += n_bytes; in null_writer()
213 static int null_reader(struct driver_data *drv_data) in null_reader() argument
215 void __iomem *reg = drv_data->ioaddr; in null_reader()
216 u8 n_bytes = drv_data->n_bytes; in null_reader()
219 && (drv_data->rx < drv_data->rx_end)) { in null_reader()
221 drv_data->rx += n_bytes; in null_reader()
224 return drv_data->rx == drv_data->rx_end; in null_reader()
227 static int u8_writer(struct driver_data *drv_data) in u8_writer() argument
229 void __iomem *reg = drv_data->ioaddr; in u8_writer()
232 || (drv_data->tx == drv_data->tx_end)) in u8_writer()
235 write_SSDR(*(u8 *)(drv_data->tx), reg); in u8_writer()
236 ++drv_data->tx; in u8_writer()
241 static int u8_reader(struct driver_data *drv_data) in u8_reader() argument
243 void __iomem *reg = drv_data->ioaddr; in u8_reader()
246 && (drv_data->rx < drv_data->rx_end)) { in u8_reader()
247 *(u8 *)(drv_data->rx) = read_SSDR(reg); in u8_reader()
248 ++drv_data->rx; in u8_reader()
251 return drv_data->rx == drv_data->rx_end; in u8_reader()
254 static int u16_writer(struct driver_data *drv_data) in u16_writer() argument
256 void __iomem *reg = drv_data->ioaddr; in u16_writer()
259 || (drv_data->tx == drv_data->tx_end)) in u16_writer()
262 write_SSDR(*(u16 *)(drv_data->tx), reg); in u16_writer()
263 drv_data->tx += 2; in u16_writer()
268 static int u16_reader(struct driver_data *drv_data) in u16_reader() argument
270 void __iomem *reg = drv_data->ioaddr; in u16_reader()
273 && (drv_data->rx < drv_data->rx_end)) { in u16_reader()
274 *(u16 *)(drv_data->rx) = read_SSDR(reg); in u16_reader()
275 drv_data->rx += 2; in u16_reader()
278 return drv_data->rx == drv_data->rx_end; in u16_reader()
281 static int u32_writer(struct driver_data *drv_data) in u32_writer() argument
283 void __iomem *reg = drv_data->ioaddr; in u32_writer()
286 || (drv_data->tx == drv_data->tx_end)) in u32_writer()
289 write_SSDR(*(u32 *)(drv_data->tx), reg); in u32_writer()
290 drv_data->tx += 4; in u32_writer()
295 static int u32_reader(struct driver_data *drv_data) in u32_reader() argument
297 void __iomem *reg = drv_data->ioaddr; in u32_reader()
300 && (drv_data->rx < drv_data->rx_end)) { in u32_reader()
301 *(u32 *)(drv_data->rx) = read_SSDR(reg); in u32_reader()
302 drv_data->rx += 4; in u32_reader()
305 return drv_data->rx == drv_data->rx_end; in u32_reader()
308 static void *next_transfer(struct driver_data *drv_data) in next_transfer() argument
310 struct spi_message *msg = drv_data->cur_msg; in next_transfer()
311 struct spi_transfer *trans = drv_data->cur_transfer; in next_transfer()
315 drv_data->cur_transfer = in next_transfer()
324 static int map_dma_buffers(struct driver_data *drv_data) in map_dma_buffers() argument
326 struct spi_message *msg = drv_data->cur_msg; in map_dma_buffers()
329 if (!drv_data->cur_chip->enable_dma) in map_dma_buffers()
333 return drv_data->rx_dma && drv_data->tx_dma; in map_dma_buffers()
335 if (!IS_DMA_ALIGNED(drv_data->rx) || !IS_DMA_ALIGNED(drv_data->tx)) in map_dma_buffers()
339 if (drv_data->rx == NULL) { in map_dma_buffers()
340 *drv_data->null_dma_buf = 0; in map_dma_buffers()
341 drv_data->rx = drv_data->null_dma_buf; in map_dma_buffers()
342 drv_data->rx_map_len = 4; in map_dma_buffers()
344 drv_data->rx_map_len = drv_data->len; in map_dma_buffers()
348 if (drv_data->tx == NULL) { in map_dma_buffers()
349 *drv_data->null_dma_buf = 0; in map_dma_buffers()
350 drv_data->tx = drv_data->null_dma_buf; in map_dma_buffers()
351 drv_data->tx_map_len = 4; in map_dma_buffers()
353 drv_data->tx_map_len = drv_data->len; in map_dma_buffers()
359 drv_data->tx_dma = dma_map_single(dev, drv_data->tx, in map_dma_buffers()
360 drv_data->tx_map_len, DMA_TO_DEVICE); in map_dma_buffers()
361 if (dma_mapping_error(dev, drv_data->tx_dma)) in map_dma_buffers()
365 drv_data->rx_dma = dma_map_single(dev, drv_data->rx, in map_dma_buffers()
366 drv_data->rx_map_len, DMA_FROM_DEVICE); in map_dma_buffers()
367 if (dma_mapping_error(dev, drv_data->rx_dma)) { in map_dma_buffers()
368 dma_unmap_single(dev, drv_data->tx_dma, in map_dma_buffers()
369 drv_data->tx_map_len, DMA_TO_DEVICE); in map_dma_buffers()
376 static void unmap_dma_buffers(struct driver_data *drv_data) in unmap_dma_buffers() argument
380 if (!drv_data->dma_mapped) in unmap_dma_buffers()
383 if (!drv_data->cur_msg->is_dma_mapped) { in unmap_dma_buffers()
384 dev = &drv_data->cur_msg->spi->dev; in unmap_dma_buffers()
385 dma_unmap_single(dev, drv_data->rx_dma, in unmap_dma_buffers()
386 drv_data->rx_map_len, DMA_FROM_DEVICE); in unmap_dma_buffers()
387 dma_unmap_single(dev, drv_data->tx_dma, in unmap_dma_buffers()
388 drv_data->tx_map_len, DMA_TO_DEVICE); in unmap_dma_buffers()
391 drv_data->dma_mapped = 0; in unmap_dma_buffers()
395 static void giveback(struct driver_data *drv_data) in giveback() argument
401 spin_lock_irqsave(&drv_data->lock, flags); in giveback()
402 msg = drv_data->cur_msg; in giveback()
403 drv_data->cur_msg = NULL; in giveback()
404 drv_data->cur_transfer = NULL; in giveback()
405 drv_data->cur_chip = NULL; in giveback()
406 queue_work(drv_data->workqueue, &drv_data->pump_messages); in giveback()
407 spin_unlock_irqrestore(&drv_data->lock, flags); in giveback()
421 drv_data->cs_control(PXA2XX_CS_DEASSERT); in giveback()
436 spin_lock_irqsave(&drv_data->lock, flags); in giveback()
437 if (list_empty(&drv_data->queue)) in giveback()
440 next_msg = list_entry(drv_data->queue.next, in giveback()
442 spin_unlock_irqrestore(&drv_data->lock, flags); in giveback()
450 drv_data->cs_control(PXA2XX_CS_DEASSERT); in giveback()
478 static void dma_error_stop(struct driver_data *drv_data, const char *msg) in dma_error_stop() argument
480 void __iomem *reg = drv_data->ioaddr; in dma_error_stop()
483 DCSR(drv_data->rx_channel) = RESET_DMA_CHANNEL; in dma_error_stop()
484 DCSR(drv_data->tx_channel) = RESET_DMA_CHANNEL; in dma_error_stop()
485 write_SSSR(drv_data->clear_sr, reg); in dma_error_stop()
486 write_SSCR1(read_SSCR1(reg) & ~drv_data->dma_cr1, reg); in dma_error_stop()
487 if (drv_data->ssp_type != PXA25x_SSP) in dma_error_stop()
489 flush(drv_data); in dma_error_stop()
492 unmap_dma_buffers(drv_data); in dma_error_stop()
494 dev_err(&drv_data->pdev->dev, "%s\n", msg); in dma_error_stop()
496 drv_data->cur_msg->state = ERROR_STATE; in dma_error_stop()
497 tasklet_schedule(&drv_data->pump_transfers); in dma_error_stop()
500 static void dma_transfer_complete(struct driver_data *drv_data) in dma_transfer_complete() argument
502 void __iomem *reg = drv_data->ioaddr; in dma_transfer_complete()
503 struct spi_message *msg = drv_data->cur_msg; in dma_transfer_complete()
506 write_SSCR1(read_SSCR1(reg) & ~drv_data->dma_cr1, reg); in dma_transfer_complete()
507 write_SSSR(drv_data->clear_sr, reg); in dma_transfer_complete()
508 DCSR(drv_data->tx_channel) = RESET_DMA_CHANNEL; in dma_transfer_complete()
509 DCSR(drv_data->rx_channel) = RESET_DMA_CHANNEL; in dma_transfer_complete()
511 if (wait_dma_channel_stop(drv_data->rx_channel) == 0) in dma_transfer_complete()
512 dev_err(&drv_data->pdev->dev, in dma_transfer_complete()
515 if (wait_ssp_rx_stall(drv_data->ioaddr) == 0) in dma_transfer_complete()
516 dev_err(&drv_data->pdev->dev, in dma_transfer_complete()
519 unmap_dma_buffers(drv_data); in dma_transfer_complete()
522 drv_data->rx += drv_data->len - in dma_transfer_complete()
523 (DCMD(drv_data->rx_channel) & DCMD_LENGTH); in dma_transfer_complete()
528 drv_data->read(drv_data); in dma_transfer_complete()
531 msg->actual_length += drv_data->len - in dma_transfer_complete()
532 (drv_data->rx_end - drv_data->rx); in dma_transfer_complete()
539 msg->state = next_transfer(drv_data); in dma_transfer_complete()
542 tasklet_schedule(&drv_data->pump_transfers); in dma_transfer_complete()
547 struct driver_data *drv_data = data; in dma_handler() local
552 if (channel == drv_data->tx_channel) in dma_handler()
553 dma_error_stop(drv_data, in dma_handler()
557 dma_error_stop(drv_data, in dma_handler()
564 if ((channel == drv_data->tx_channel) in dma_handler()
566 && (drv_data->ssp_type == PXA25x_SSP)) { in dma_handler()
569 if (wait_ssp_rx_stall(drv_data->ioaddr) == 0) in dma_handler()
570 dev_err(&drv_data->pdev->dev, in dma_handler()
574 dma_transfer_complete(drv_data); in dma_handler()
578 static irqreturn_t dma_transfer(struct driver_data *drv_data) in dma_transfer() argument
581 void __iomem *reg = drv_data->ioaddr; in dma_transfer()
583 irq_status = read_SSSR(reg) & drv_data->mask_sr; in dma_transfer()
585 dma_error_stop(drv_data, "dma_transfer: fifo overrun"); in dma_transfer()
591 && (DCSR(drv_data->tx_channel) & DCSR_RUN)) { in dma_transfer()
596 if (irq_status & SSSR_TINT || drv_data->rx == drv_data->rx_end) { in dma_transfer()
600 if (drv_data->ssp_type != PXA25x_SSP) in dma_transfer()
604 dma_transfer_complete(drv_data); in dma_transfer()
613 static void int_error_stop(struct driver_data *drv_data, const char* msg) in int_error_stop() argument
615 void __iomem *reg = drv_data->ioaddr; in int_error_stop()
618 write_SSSR(drv_data->clear_sr, reg); in int_error_stop()
619 write_SSCR1(read_SSCR1(reg) & ~drv_data->int_cr1, reg); in int_error_stop()
620 if (drv_data->ssp_type != PXA25x_SSP) in int_error_stop()
622 flush(drv_data); in int_error_stop()
625 dev_err(&drv_data->pdev->dev, "%s\n", msg); in int_error_stop()
627 drv_data->cur_msg->state = ERROR_STATE; in int_error_stop()
628 tasklet_schedule(&drv_data->pump_transfers); in int_error_stop()
631 static void int_transfer_complete(struct driver_data *drv_data) in int_transfer_complete() argument
633 void __iomem *reg = drv_data->ioaddr; in int_transfer_complete()
636 write_SSSR(drv_data->clear_sr, reg); in int_transfer_complete()
637 write_SSCR1(read_SSCR1(reg) & ~drv_data->int_cr1, reg); in int_transfer_complete()
638 if (drv_data->ssp_type != PXA25x_SSP) in int_transfer_complete()
642 drv_data->cur_msg->actual_length += drv_data->len - in int_transfer_complete()
643 (drv_data->rx_end - drv_data->rx); in int_transfer_complete()
650 drv_data->cur_msg->state = next_transfer(drv_data); in int_transfer_complete()
653 tasklet_schedule(&drv_data->pump_transfers); in int_transfer_complete()
656 static irqreturn_t interrupt_transfer(struct driver_data *drv_data) in interrupt_transfer() argument
658 void __iomem *reg = drv_data->ioaddr; in interrupt_transfer()
661 drv_data->mask_sr : drv_data->mask_sr & ~SSSR_TFS; in interrupt_transfer()
666 int_error_stop(drv_data, "interrupt_transfer: fifo overrun"); in interrupt_transfer()
672 if (drv_data->read(drv_data)) { in interrupt_transfer()
673 int_transfer_complete(drv_data); in interrupt_transfer()
680 if (drv_data->read(drv_data)) { in interrupt_transfer()
681 int_transfer_complete(drv_data); in interrupt_transfer()
684 } while (drv_data->write(drv_data)); in interrupt_transfer()
686 if (drv_data->read(drv_data)) { in interrupt_transfer()
687 int_transfer_complete(drv_data); in interrupt_transfer()
691 if (drv_data->tx == drv_data->tx_end) { in interrupt_transfer()
694 if (drv_data->ssp_type == PXA25x_SSP) { in interrupt_transfer()
697 int_error_stop(drv_data, "interrupt_transfer: " in interrupt_transfer()
701 if (!drv_data->read(drv_data)) in interrupt_transfer()
703 int_error_stop(drv_data, in interrupt_transfer()
708 int_transfer_complete(drv_data); in interrupt_transfer()
718 struct driver_data *drv_data = dev_id; in ssp_int() local
719 void __iomem *reg = drv_data->ioaddr; in ssp_int()
721 if (!drv_data->cur_msg) { in ssp_int()
724 write_SSCR1(read_SSCR1(reg) & ~drv_data->int_cr1, reg); in ssp_int()
725 if (drv_data->ssp_type != PXA25x_SSP) in ssp_int()
727 write_SSSR(drv_data->clear_sr, reg); in ssp_int()
729 dev_err(&drv_data->pdev->dev, "bad message state " in ssp_int()
736 return drv_data->transfer_handler(drv_data); in ssp_int()
848 struct driver_data *drv_data = (struct driver_data *)data; in pump_transfers() local
853 struct ssp_device *ssp = drv_data->ssp; in pump_transfers()
854 void __iomem *reg = drv_data->ioaddr; in pump_transfers()
860 u32 dma_thresh = drv_data->cur_chip->dma_threshold; in pump_transfers()
861 u32 dma_burst = drv_data->cur_chip->dma_burst_size; in pump_transfers()
864 message = drv_data->cur_msg; in pump_transfers()
865 transfer = drv_data->cur_transfer; in pump_transfers()
866 chip = drv_data->cur_chip; in pump_transfers()
871 giveback(drv_data); in pump_transfers()
878 giveback(drv_data); in pump_transfers()
892 drv_data->cs_control(PXA2XX_CS_DEASSERT); in pump_transfers()
901 dev_err(&drv_data->pdev->dev, in pump_transfers()
906 giveback(drv_data); in pump_transfers()
915 (long)drv_data->len, MAX_DMA_LEN); in pump_transfers()
919 if (flush(drv_data) == 0) { in pump_transfers()
920 dev_err(&drv_data->pdev->dev, "pump_transfers: flush failed\n"); in pump_transfers()
922 giveback(drv_data); in pump_transfers()
925 drv_data->n_bytes = chip->n_bytes; in pump_transfers()
926 drv_data->dma_width = chip->dma_width; in pump_transfers()
927 drv_data->cs_control = chip->cs_control; in pump_transfers()
928 drv_data->tx = (void *)transfer->tx_buf; in pump_transfers()
929 drv_data->tx_end = drv_data->tx + transfer->len; in pump_transfers()
930 drv_data->rx = transfer->rx_buf; in pump_transfers()
931 drv_data->rx_end = drv_data->rx + transfer->len; in pump_transfers()
932 drv_data->rx_dma = transfer->rx_dma; in pump_transfers()
933 drv_data->tx_dma = transfer->tx_dma; in pump_transfers()
934 drv_data->len = transfer->len & DCMD_LENGTH; in pump_transfers()
935 drv_data->write = drv_data->tx ? chip->write : null_writer; in pump_transfers()
936 drv_data->read = drv_data->rx ? chip->read : null_reader; in pump_transfers()
954 drv_data->n_bytes = 1; in pump_transfers()
955 drv_data->dma_width = DCMD_WIDTH1; in pump_transfers()
956 drv_data->read = drv_data->read != null_reader ? in pump_transfers()
958 drv_data->write = drv_data->write != null_writer ? in pump_transfers()
961 drv_data->n_bytes = 2; in pump_transfers()
962 drv_data->dma_width = DCMD_WIDTH2; in pump_transfers()
963 drv_data->read = drv_data->read != null_reader ? in pump_transfers()
965 drv_data->write = drv_data->write != null_writer ? in pump_transfers()
968 drv_data->n_bytes = 4; in pump_transfers()
969 drv_data->dma_width = DCMD_WIDTH4; in pump_transfers()
970 drv_data->read = drv_data->read != null_reader ? in pump_transfers()
972 drv_data->write = drv_data->write != null_writer ? in pump_transfers()
1010 drv_data->dma_mapped = 0; in pump_transfers()
1011 if (drv_data->len > 0 && drv_data->len <= MAX_DMA_LEN) in pump_transfers()
1012 drv_data->dma_mapped = map_dma_buffers(drv_data); in pump_transfers()
1013 if (drv_data->dma_mapped) { in pump_transfers()
1016 drv_data->transfer_handler = dma_transfer; in pump_transfers()
1019 DCSR(drv_data->rx_channel) = RESET_DMA_CHANNEL; in pump_transfers()
1020 DSADR(drv_data->rx_channel) = drv_data->ssdr_physical; in pump_transfers()
1021 DTADR(drv_data->rx_channel) = drv_data->rx_dma; in pump_transfers()
1022 if (drv_data->rx == drv_data->null_dma_buf) in pump_transfers()
1024 DCMD(drv_data->rx_channel) = DCMD_FLOWSRC in pump_transfers()
1025 | drv_data->dma_width in pump_transfers()
1027 | drv_data->len; in pump_transfers()
1029 DCMD(drv_data->rx_channel) = DCMD_INCTRGADDR in pump_transfers()
1031 | drv_data->dma_width in pump_transfers()
1033 | drv_data->len; in pump_transfers()
1036 DCSR(drv_data->tx_channel) = RESET_DMA_CHANNEL; in pump_transfers()
1037 DSADR(drv_data->tx_channel) = drv_data->tx_dma; in pump_transfers()
1038 DTADR(drv_data->tx_channel) = drv_data->ssdr_physical; in pump_transfers()
1039 if (drv_data->tx == drv_data->null_dma_buf) in pump_transfers()
1041 DCMD(drv_data->tx_channel) = DCMD_FLOWTRG in pump_transfers()
1042 | drv_data->dma_width in pump_transfers()
1044 | drv_data->len; in pump_transfers()
1046 DCMD(drv_data->tx_channel) = DCMD_INCSRCADDR in pump_transfers()
1048 | drv_data->dma_width in pump_transfers()
1050 | drv_data->len; in pump_transfers()
1053 if (drv_data->ssp_type == PXA25x_SSP) in pump_transfers()
1054 DCMD(drv_data->tx_channel) |= DCMD_ENDIRQEN; in pump_transfers()
1057 cr1 = chip->cr1 | dma_thresh | drv_data->dma_cr1; in pump_transfers()
1058 write_SSSR(drv_data->clear_sr, reg); in pump_transfers()
1059 DCSR(drv_data->rx_channel) |= DCSR_RUN; in pump_transfers()
1060 DCSR(drv_data->tx_channel) |= DCSR_RUN; in pump_transfers()
1063 drv_data->transfer_handler = interrupt_transfer; in pump_transfers()
1066 cr1 = chip->cr1 | chip->threshold | drv_data->int_cr1; in pump_transfers()
1067 write_SSSR(drv_data->clear_sr, reg); in pump_transfers()
1077 if (drv_data->ssp_type != PXA25x_SSP) in pump_transfers()
1085 if (drv_data->ssp_type != PXA25x_SSP) in pump_transfers()
1093 drv_data->cs_control(PXA2XX_CS_ASSERT); in pump_transfers()
1102 struct driver_data *drv_data = in pump_messages() local
1107 spin_lock_irqsave(&drv_data->lock, flags); in pump_messages()
1108 if (list_empty(&drv_data->queue) || drv_data->run == QUEUE_STOPPED) { in pump_messages()
1109 drv_data->busy = 0; in pump_messages()
1110 spin_unlock_irqrestore(&drv_data->lock, flags); in pump_messages()
1115 if (drv_data->cur_msg) { in pump_messages()
1116 spin_unlock_irqrestore(&drv_data->lock, flags); in pump_messages()
1121 drv_data->cur_msg = list_entry(drv_data->queue.next, in pump_messages()
1123 list_del_init(&drv_data->cur_msg->queue); in pump_messages()
1126 drv_data->cur_msg->state = START_STATE; in pump_messages()
1127 drv_data->cur_transfer = list_entry(drv_data->cur_msg->transfers.next, in pump_messages()
1133 drv_data->cur_chip = spi_get_ctldata(drv_data->cur_msg->spi); in pump_messages()
1136 tasklet_schedule(&drv_data->pump_transfers); in pump_messages()
1138 drv_data->busy = 1; in pump_messages()
1139 spin_unlock_irqrestore(&drv_data->lock, flags); in pump_messages()
1144 struct driver_data *drv_data = spi_master_get_devdata(spi->master); in transfer() local
1147 spin_lock_irqsave(&drv_data->lock, flags); in transfer()
1149 if (drv_data->run == QUEUE_STOPPED) { in transfer()
1150 spin_unlock_irqrestore(&drv_data->lock, flags); in transfer()
1158 list_add_tail(&msg->queue, &drv_data->queue); in transfer()
1160 if (drv_data->run == QUEUE_RUNNING && !drv_data->busy) in transfer()
1161 queue_work(drv_data->workqueue, &drv_data->pump_messages); in transfer()
1163 spin_unlock_irqrestore(&drv_data->lock, flags); in transfer()
1175 struct driver_data *drv_data = spi_master_get_devdata(spi->master); in setup() local
1176 struct ssp_device *ssp = drv_data->ssp; in setup()
1184 if (drv_data->ssp_type != PXA25x_SSP in setup()
1188 drv_data->ssp_type, spi->bits_per_word); in setup()
1191 else if (drv_data->ssp_type == PXA25x_SSP in setup()
1196 drv_data->ssp_type, spi->bits_per_word); in setup()
1219 chip->dma_burst_size = drv_data->master_info->enable_dma ? in setup()
1238 chip->enable_dma = drv_data->master_info->enable_dma; in setup()
1274 if (drv_data->ssp_type != PXA25x_SSP) in setup()
1323 static int __init init_queue(struct driver_data *drv_data) in init_queue() argument
1325 INIT_LIST_HEAD(&drv_data->queue); in init_queue()
1326 spin_lock_init(&drv_data->lock); in init_queue()
1328 drv_data->run = QUEUE_STOPPED; in init_queue()
1329 drv_data->busy = 0; in init_queue()
1331 tasklet_init(&drv_data->pump_transfers, in init_queue()
1332 pump_transfers, (unsigned long)drv_data); in init_queue()
1334 INIT_WORK(&drv_data->pump_messages, pump_messages); in init_queue()
1335 drv_data->workqueue = create_singlethread_workqueue( in init_queue()
1336 drv_data->master->dev.parent->bus_id); in init_queue()
1337 if (drv_data->workqueue == NULL) in init_queue()
1343 static int start_queue(struct driver_data *drv_data) in start_queue() argument
1347 spin_lock_irqsave(&drv_data->lock, flags); in start_queue()
1349 if (drv_data->run == QUEUE_RUNNING || drv_data->busy) { in start_queue()
1350 spin_unlock_irqrestore(&drv_data->lock, flags); in start_queue()
1354 drv_data->run = QUEUE_RUNNING; in start_queue()
1355 drv_data->cur_msg = NULL; in start_queue()
1356 drv_data->cur_transfer = NULL; in start_queue()
1357 drv_data->cur_chip = NULL; in start_queue()
1358 spin_unlock_irqrestore(&drv_data->lock, flags); in start_queue()
1360 queue_work(drv_data->workqueue, &drv_data->pump_messages); in start_queue()
1365 static int stop_queue(struct driver_data *drv_data) in stop_queue() argument
1371 spin_lock_irqsave(&drv_data->lock, flags); in stop_queue()
1377 drv_data->run = QUEUE_STOPPED; in stop_queue()
1378 while (!list_empty(&drv_data->queue) && drv_data->busy && limit--) { in stop_queue()
1379 spin_unlock_irqrestore(&drv_data->lock, flags); in stop_queue()
1381 spin_lock_irqsave(&drv_data->lock, flags); in stop_queue()
1384 if (!list_empty(&drv_data->queue) || drv_data->busy) in stop_queue()
1387 spin_unlock_irqrestore(&drv_data->lock, flags); in stop_queue()
1392 static int destroy_queue(struct driver_data *drv_data) in destroy_queue() argument
1396 status = stop_queue(drv_data); in destroy_queue()
1406 destroy_workqueue(drv_data->workqueue); in destroy_queue()
1416 struct driver_data *drv_data; in pxa2xx_spi_probe() local
1435 drv_data = spi_master_get_devdata(master); in pxa2xx_spi_probe()
1436 drv_data->master = master; in pxa2xx_spi_probe()
1437 drv_data->master_info = platform_info; in pxa2xx_spi_probe()
1438 drv_data->pdev = pdev; in pxa2xx_spi_probe()
1439 drv_data->ssp = ssp; in pxa2xx_spi_probe()
1447 drv_data->ssp_type = ssp->type; in pxa2xx_spi_probe()
1448 drv_data->null_dma_buf = (u32 *)ALIGN((u32)(drv_data + in pxa2xx_spi_probe()
1451 drv_data->ioaddr = ssp->mmio_base; in pxa2xx_spi_probe()
1452 drv_data->ssdr_physical = ssp->phys_base + SSDR; in pxa2xx_spi_probe()
1454 drv_data->int_cr1 = SSCR1_TIE | SSCR1_RIE; in pxa2xx_spi_probe()
1455 drv_data->dma_cr1 = 0; in pxa2xx_spi_probe()
1456 drv_data->clear_sr = SSSR_ROR; in pxa2xx_spi_probe()
1457 drv_data->mask_sr = SSSR_RFS | SSSR_TFS | SSSR_ROR; in pxa2xx_spi_probe()
1459 drv_data->int_cr1 = SSCR1_TIE | SSCR1_RIE | SSCR1_TINTE; in pxa2xx_spi_probe()
1460 drv_data->dma_cr1 = SSCR1_TSRE | SSCR1_RSRE | SSCR1_TINTE; in pxa2xx_spi_probe()
1461 drv_data->clear_sr = SSSR_ROR | SSSR_TINT; in pxa2xx_spi_probe()
1462 drv_data->mask_sr = SSSR_TINT | SSSR_RFS | SSSR_TFS | SSSR_ROR; in pxa2xx_spi_probe()
1465 status = request_irq(ssp->irq, ssp_int, 0, dev->bus_id, drv_data); in pxa2xx_spi_probe()
1472 drv_data->tx_channel = -1; in pxa2xx_spi_probe()
1473 drv_data->rx_channel = -1; in pxa2xx_spi_probe()
1477 drv_data->rx_channel = pxa_request_dma("pxa2xx_spi_ssp_rx", in pxa2xx_spi_probe()
1480 drv_data); in pxa2xx_spi_probe()
1481 if (drv_data->rx_channel < 0) { in pxa2xx_spi_probe()
1483 drv_data->rx_channel); in pxa2xx_spi_probe()
1487 drv_data->tx_channel = pxa_request_dma("pxa2xx_spi_ssp_tx", in pxa2xx_spi_probe()
1490 drv_data); in pxa2xx_spi_probe()
1491 if (drv_data->tx_channel < 0) { in pxa2xx_spi_probe()
1493 drv_data->tx_channel); in pxa2xx_spi_probe()
1498 DRCMR(ssp->drcmr_rx) = DRCMR_MAPVLD | drv_data->rx_channel; in pxa2xx_spi_probe()
1499 DRCMR(ssp->drcmr_tx) = DRCMR_MAPVLD | drv_data->tx_channel; in pxa2xx_spi_probe()
1506 write_SSCR0(0, drv_data->ioaddr); in pxa2xx_spi_probe()
1509 drv_data->ioaddr); in pxa2xx_spi_probe()
1513 drv_data->ioaddr); in pxa2xx_spi_probe()
1514 if (drv_data->ssp_type != PXA25x_SSP) in pxa2xx_spi_probe()
1515 write_SSTO(0, drv_data->ioaddr); in pxa2xx_spi_probe()
1516 write_SSPSP(0, drv_data->ioaddr); in pxa2xx_spi_probe()
1519 status = init_queue(drv_data); in pxa2xx_spi_probe()
1524 status = start_queue(drv_data); in pxa2xx_spi_probe()
1531 platform_set_drvdata(pdev, drv_data); in pxa2xx_spi_probe()
1541 destroy_queue(drv_data); in pxa2xx_spi_probe()
1547 if (drv_data->tx_channel != -1) in pxa2xx_spi_probe()
1548 pxa_free_dma(drv_data->tx_channel); in pxa2xx_spi_probe()
1549 if (drv_data->rx_channel != -1) in pxa2xx_spi_probe()
1550 pxa_free_dma(drv_data->rx_channel); in pxa2xx_spi_probe()
1553 free_irq(ssp->irq, drv_data); in pxa2xx_spi_probe()
1563 struct driver_data *drv_data = platform_get_drvdata(pdev); in pxa2xx_spi_remove() local
1567 if (!drv_data) in pxa2xx_spi_remove()
1569 ssp = drv_data->ssp; in pxa2xx_spi_remove()
1572 status = destroy_queue(drv_data); in pxa2xx_spi_remove()
1586 write_SSCR0(0, drv_data->ioaddr); in pxa2xx_spi_remove()
1590 if (drv_data->master_info->enable_dma) { in pxa2xx_spi_remove()
1593 pxa_free_dma(drv_data->tx_channel); in pxa2xx_spi_remove()
1594 pxa_free_dma(drv_data->rx_channel); in pxa2xx_spi_remove()
1598 free_irq(ssp->irq, drv_data); in pxa2xx_spi_remove()
1604 spi_unregister_master(drv_data->master); in pxa2xx_spi_remove()
1624 struct driver_data *drv_data = platform_get_drvdata(pdev); in pxa2xx_spi_suspend() local
1625 struct ssp_device *ssp = drv_data->ssp; in pxa2xx_spi_suspend()
1628 status = stop_queue(drv_data); in pxa2xx_spi_suspend()
1631 write_SSCR0(0, drv_data->ioaddr); in pxa2xx_spi_suspend()
1639 struct driver_data *drv_data = platform_get_drvdata(pdev); in pxa2xx_spi_resume() local
1640 struct ssp_device *ssp = drv_data->ssp; in pxa2xx_spi_resume()
1647 status = start_queue(drv_data); in pxa2xx_spi_resume()