• Home
  • Raw
  • Download

Lines Matching refs:drv_data

119 static inline u16 read_##reg(struct driver_data *drv_data) \
120 { return bfin_read16(drv_data->regs_base + off); } \
121 static inline void write_##reg(struct driver_data *drv_data, u16 v) \
122 { bfin_write16(drv_data->regs_base + off, v); }
132 static void bfin_spi_enable(struct driver_data *drv_data) in bfin_spi_enable() argument
136 cr = read_CTRL(drv_data); in bfin_spi_enable()
137 write_CTRL(drv_data, (cr | BIT_CTL_ENABLE)); in bfin_spi_enable()
140 static void bfin_spi_disable(struct driver_data *drv_data) in bfin_spi_disable() argument
144 cr = read_CTRL(drv_data); in bfin_spi_disable()
145 write_CTRL(drv_data, (cr & (~BIT_CTL_ENABLE))); in bfin_spi_disable()
160 static int flush(struct driver_data *drv_data) in flush() argument
165 while (!(read_STAT(drv_data) & BIT_STAT_SPIF) && limit--) in flush()
168 write_STAT(drv_data, BIT_STAT_CLR); in flush()
174 static void cs_active(struct driver_data *drv_data, struct chip_data *chip) in cs_active() argument
176 u16 flag = read_FLAG(drv_data); in cs_active()
181 write_FLAG(drv_data, flag); in cs_active()
184 static void cs_deactive(struct driver_data *drv_data, struct chip_data *chip) in cs_deactive() argument
186 u16 flag = read_FLAG(drv_data); in cs_deactive()
190 write_FLAG(drv_data, flag); in cs_deactive()
200 static void restore_state(struct driver_data *drv_data) in restore_state() argument
202 struct chip_data *chip = drv_data->cur_chip; in restore_state()
205 write_STAT(drv_data, BIT_STAT_CLR); in restore_state()
206 bfin_spi_disable(drv_data); in restore_state()
207 dev_dbg(&drv_data->pdev->dev, "restoring spi ctl state\n"); in restore_state()
210 write_CTRL(drv_data, chip->ctl_reg); in restore_state()
211 write_BAUD(drv_data, chip->baud); in restore_state()
213 bfin_spi_enable(drv_data); in restore_state()
214 cs_active(drv_data, chip); in restore_state()
218 static unsigned short dummy_read(struct driver_data *drv_data) in dummy_read() argument
221 tmp = read_RDBR(drv_data); in dummy_read()
225 static void null_writer(struct driver_data *drv_data) in null_writer() argument
227 u8 n_bytes = drv_data->n_bytes; in null_writer()
229 while (drv_data->tx < drv_data->tx_end) { in null_writer()
230 write_TDBR(drv_data, 0); in null_writer()
231 while ((read_STAT(drv_data) & BIT_STAT_TXS)) in null_writer()
233 drv_data->tx += n_bytes; in null_writer()
237 static void null_reader(struct driver_data *drv_data) in null_reader() argument
239 u8 n_bytes = drv_data->n_bytes; in null_reader()
240 dummy_read(drv_data); in null_reader()
242 while (drv_data->rx < drv_data->rx_end) { in null_reader()
243 while (!(read_STAT(drv_data) & BIT_STAT_RXS)) in null_reader()
245 dummy_read(drv_data); in null_reader()
246 drv_data->rx += n_bytes; in null_reader()
250 static void u8_writer(struct driver_data *drv_data) in u8_writer() argument
252 dev_dbg(&drv_data->pdev->dev, in u8_writer()
253 "cr8-s is 0x%x\n", read_STAT(drv_data)); in u8_writer()
255 while (drv_data->tx < drv_data->tx_end) { in u8_writer()
256 write_TDBR(drv_data, (*(u8 *) (drv_data->tx))); in u8_writer()
257 while (read_STAT(drv_data) & BIT_STAT_TXS) in u8_writer()
259 ++drv_data->tx; in u8_writer()
263 while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) in u8_writer()
267 static void u8_cs_chg_writer(struct driver_data *drv_data) in u8_cs_chg_writer() argument
269 struct chip_data *chip = drv_data->cur_chip; in u8_cs_chg_writer()
271 while (drv_data->tx < drv_data->tx_end) { in u8_cs_chg_writer()
272 cs_active(drv_data, chip); in u8_cs_chg_writer()
274 write_TDBR(drv_data, (*(u8 *) (drv_data->tx))); in u8_cs_chg_writer()
275 while (read_STAT(drv_data) & BIT_STAT_TXS) in u8_cs_chg_writer()
277 while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) in u8_cs_chg_writer()
280 cs_deactive(drv_data, chip); in u8_cs_chg_writer()
282 ++drv_data->tx; in u8_cs_chg_writer()
286 static void u8_reader(struct driver_data *drv_data) in u8_reader() argument
288 dev_dbg(&drv_data->pdev->dev, in u8_reader()
289 "cr-8 is 0x%x\n", read_STAT(drv_data)); in u8_reader()
292 while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) in u8_reader()
296 write_TDBR(drv_data, 0xFFFF); in u8_reader()
298 dummy_read(drv_data); in u8_reader()
300 while (drv_data->rx < drv_data->rx_end - 1) { in u8_reader()
301 while (!(read_STAT(drv_data) & BIT_STAT_RXS)) in u8_reader()
303 *(u8 *) (drv_data->rx) = read_RDBR(drv_data); in u8_reader()
304 ++drv_data->rx; in u8_reader()
307 while (!(read_STAT(drv_data) & BIT_STAT_RXS)) in u8_reader()
309 *(u8 *) (drv_data->rx) = read_SHAW(drv_data); in u8_reader()
310 ++drv_data->rx; in u8_reader()
313 static void u8_cs_chg_reader(struct driver_data *drv_data) in u8_cs_chg_reader() argument
315 struct chip_data *chip = drv_data->cur_chip; in u8_cs_chg_reader()
317 while (drv_data->rx < drv_data->rx_end) { in u8_cs_chg_reader()
318 cs_active(drv_data, chip); in u8_cs_chg_reader()
319 read_RDBR(drv_data); /* kick off */ in u8_cs_chg_reader()
321 while (!(read_STAT(drv_data) & BIT_STAT_RXS)) in u8_cs_chg_reader()
323 while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) in u8_cs_chg_reader()
326 *(u8 *) (drv_data->rx) = read_SHAW(drv_data); in u8_cs_chg_reader()
327 cs_deactive(drv_data, chip); in u8_cs_chg_reader()
329 ++drv_data->rx; in u8_cs_chg_reader()
333 static void u8_duplex(struct driver_data *drv_data) in u8_duplex() argument
336 while (drv_data->rx < drv_data->rx_end) { in u8_duplex()
337 write_TDBR(drv_data, (*(u8 *) (drv_data->tx))); in u8_duplex()
338 while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) in u8_duplex()
340 while (!(read_STAT(drv_data) & BIT_STAT_RXS)) in u8_duplex()
342 *(u8 *) (drv_data->rx) = read_RDBR(drv_data); in u8_duplex()
343 ++drv_data->rx; in u8_duplex()
344 ++drv_data->tx; in u8_duplex()
348 static void u8_cs_chg_duplex(struct driver_data *drv_data) in u8_cs_chg_duplex() argument
350 struct chip_data *chip = drv_data->cur_chip; in u8_cs_chg_duplex()
352 while (drv_data->rx < drv_data->rx_end) { in u8_cs_chg_duplex()
353 cs_active(drv_data, chip); in u8_cs_chg_duplex()
355 write_TDBR(drv_data, (*(u8 *) (drv_data->tx))); in u8_cs_chg_duplex()
357 while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) in u8_cs_chg_duplex()
359 while (!(read_STAT(drv_data) & BIT_STAT_RXS)) in u8_cs_chg_duplex()
361 *(u8 *) (drv_data->rx) = read_RDBR(drv_data); in u8_cs_chg_duplex()
363 cs_deactive(drv_data, chip); in u8_cs_chg_duplex()
365 ++drv_data->rx; in u8_cs_chg_duplex()
366 ++drv_data->tx; in u8_cs_chg_duplex()
370 static void u16_writer(struct driver_data *drv_data) in u16_writer() argument
372 dev_dbg(&drv_data->pdev->dev, in u16_writer()
373 "cr16 is 0x%x\n", read_STAT(drv_data)); in u16_writer()
375 while (drv_data->tx < drv_data->tx_end) { in u16_writer()
376 write_TDBR(drv_data, (*(u16 *) (drv_data->tx))); in u16_writer()
377 while ((read_STAT(drv_data) & BIT_STAT_TXS)) in u16_writer()
379 drv_data->tx += 2; in u16_writer()
383 while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) in u16_writer()
387 static void u16_cs_chg_writer(struct driver_data *drv_data) in u16_cs_chg_writer() argument
389 struct chip_data *chip = drv_data->cur_chip; in u16_cs_chg_writer()
391 while (drv_data->tx < drv_data->tx_end) { in u16_cs_chg_writer()
392 cs_active(drv_data, chip); in u16_cs_chg_writer()
394 write_TDBR(drv_data, (*(u16 *) (drv_data->tx))); in u16_cs_chg_writer()
395 while ((read_STAT(drv_data) & BIT_STAT_TXS)) in u16_cs_chg_writer()
397 while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) in u16_cs_chg_writer()
400 cs_deactive(drv_data, chip); in u16_cs_chg_writer()
402 drv_data->tx += 2; in u16_cs_chg_writer()
406 static void u16_reader(struct driver_data *drv_data) in u16_reader() argument
408 dev_dbg(&drv_data->pdev->dev, in u16_reader()
409 "cr-16 is 0x%x\n", read_STAT(drv_data)); in u16_reader()
412 while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) in u16_reader()
416 write_TDBR(drv_data, 0xFFFF); in u16_reader()
418 dummy_read(drv_data); in u16_reader()
420 while (drv_data->rx < (drv_data->rx_end - 2)) { in u16_reader()
421 while (!(read_STAT(drv_data) & BIT_STAT_RXS)) in u16_reader()
423 *(u16 *) (drv_data->rx) = read_RDBR(drv_data); in u16_reader()
424 drv_data->rx += 2; in u16_reader()
427 while (!(read_STAT(drv_data) & BIT_STAT_RXS)) in u16_reader()
429 *(u16 *) (drv_data->rx) = read_SHAW(drv_data); in u16_reader()
430 drv_data->rx += 2; in u16_reader()
433 static void u16_cs_chg_reader(struct driver_data *drv_data) in u16_cs_chg_reader() argument
435 struct chip_data *chip = drv_data->cur_chip; in u16_cs_chg_reader()
438 while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) in u16_cs_chg_reader()
442 write_TDBR(drv_data, 0xFFFF); in u16_cs_chg_reader()
444 cs_active(drv_data, chip); in u16_cs_chg_reader()
445 dummy_read(drv_data); in u16_cs_chg_reader()
447 while (drv_data->rx < drv_data->rx_end - 2) { in u16_cs_chg_reader()
448 cs_deactive(drv_data, chip); in u16_cs_chg_reader()
450 while (!(read_STAT(drv_data) & BIT_STAT_RXS)) in u16_cs_chg_reader()
452 cs_active(drv_data, chip); in u16_cs_chg_reader()
453 *(u16 *) (drv_data->rx) = read_RDBR(drv_data); in u16_cs_chg_reader()
454 drv_data->rx += 2; in u16_cs_chg_reader()
456 cs_deactive(drv_data, chip); in u16_cs_chg_reader()
458 while (!(read_STAT(drv_data) & BIT_STAT_RXS)) in u16_cs_chg_reader()
460 *(u16 *) (drv_data->rx) = read_SHAW(drv_data); in u16_cs_chg_reader()
461 drv_data->rx += 2; in u16_cs_chg_reader()
464 static void u16_duplex(struct driver_data *drv_data) in u16_duplex() argument
467 while (drv_data->tx < drv_data->tx_end) { in u16_duplex()
468 write_TDBR(drv_data, (*(u16 *) (drv_data->tx))); in u16_duplex()
469 while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) in u16_duplex()
471 while (!(read_STAT(drv_data) & BIT_STAT_RXS)) in u16_duplex()
473 *(u16 *) (drv_data->rx) = read_RDBR(drv_data); in u16_duplex()
474 drv_data->rx += 2; in u16_duplex()
475 drv_data->tx += 2; in u16_duplex()
479 static void u16_cs_chg_duplex(struct driver_data *drv_data) in u16_cs_chg_duplex() argument
481 struct chip_data *chip = drv_data->cur_chip; in u16_cs_chg_duplex()
483 while (drv_data->tx < drv_data->tx_end) { in u16_cs_chg_duplex()
484 cs_active(drv_data, chip); in u16_cs_chg_duplex()
486 write_TDBR(drv_data, (*(u16 *) (drv_data->tx))); in u16_cs_chg_duplex()
487 while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) in u16_cs_chg_duplex()
489 while (!(read_STAT(drv_data) & BIT_STAT_RXS)) in u16_cs_chg_duplex()
491 *(u16 *) (drv_data->rx) = read_RDBR(drv_data); in u16_cs_chg_duplex()
493 cs_deactive(drv_data, chip); in u16_cs_chg_duplex()
495 drv_data->rx += 2; in u16_cs_chg_duplex()
496 drv_data->tx += 2; in u16_cs_chg_duplex()
501 static void *next_transfer(struct driver_data *drv_data) in next_transfer() argument
503 struct spi_message *msg = drv_data->cur_msg; in next_transfer()
504 struct spi_transfer *trans = drv_data->cur_transfer; in next_transfer()
508 drv_data->cur_transfer = in next_transfer()
520 static void giveback(struct driver_data *drv_data) in giveback() argument
522 struct chip_data *chip = drv_data->cur_chip; in giveback()
527 spin_lock_irqsave(&drv_data->lock, flags); in giveback()
528 msg = drv_data->cur_msg; in giveback()
529 drv_data->cur_msg = NULL; in giveback()
530 drv_data->cur_transfer = NULL; in giveback()
531 drv_data->cur_chip = NULL; in giveback()
532 queue_work(drv_data->workqueue, &drv_data->pump_messages); in giveback()
533 spin_unlock_irqrestore(&drv_data->lock, flags); in giveback()
541 if (drv_data->tx_dma != 0xFFFF) { in giveback()
542 cs_deactive(drv_data, chip); in giveback()
543 bfin_spi_disable(drv_data); in giveback()
546 if (!drv_data->cs_change) in giveback()
547 cs_deactive(drv_data, chip); in giveback()
555 struct driver_data *drv_data = dev_id; in dma_irq_handler() local
556 struct chip_data *chip = drv_data->cur_chip; in dma_irq_handler()
557 struct spi_message *msg = drv_data->cur_msg; in dma_irq_handler()
559 dev_dbg(&drv_data->pdev->dev, "in dma_irq_handler\n"); in dma_irq_handler()
560 clear_dma_irqstat(drv_data->dma_channel); in dma_irq_handler()
563 while (get_dma_curr_irqstat(drv_data->dma_channel) & DMA_RUN) in dma_irq_handler()
572 if (drv_data->tx != NULL) { in dma_irq_handler()
573 while ((read_STAT(drv_data) & TXS) || in dma_irq_handler()
574 (read_STAT(drv_data) & TXS)) in dma_irq_handler()
578 while (!(read_STAT(drv_data) & SPIF)) in dma_irq_handler()
581 msg->actual_length += drv_data->len_in_bytes; in dma_irq_handler()
583 if (drv_data->cs_change) in dma_irq_handler()
584 cs_deactive(drv_data, chip); in dma_irq_handler()
587 msg->state = next_transfer(drv_data); in dma_irq_handler()
590 tasklet_schedule(&drv_data->pump_transfers); in dma_irq_handler()
593 dev_dbg(&drv_data->pdev->dev, in dma_irq_handler()
595 drv_data->dma_channel); in dma_irq_handler()
596 dma_disable_irq(drv_data->dma_channel); in dma_irq_handler()
603 struct driver_data *drv_data = (struct driver_data *)data; in pump_transfers() local
614 message = drv_data->cur_msg; in pump_transfers()
615 transfer = drv_data->cur_transfer; in pump_transfers()
616 chip = drv_data->cur_chip; in pump_transfers()
625 giveback(drv_data); in pump_transfers()
632 giveback(drv_data); in pump_transfers()
645 if (flush(drv_data) == 0) { in pump_transfers()
646 dev_err(&drv_data->pdev->dev, "pump_transfers: flush failed\n"); in pump_transfers()
648 giveback(drv_data); in pump_transfers()
653 drv_data->tx = (void *)transfer->tx_buf; in pump_transfers()
654 drv_data->tx_end = drv_data->tx + transfer->len; in pump_transfers()
655 dev_dbg(&drv_data->pdev->dev, "tx_buf is %p, tx_end is %p\n", in pump_transfers()
656 transfer->tx_buf, drv_data->tx_end); in pump_transfers()
658 drv_data->tx = NULL; in pump_transfers()
663 drv_data->rx = transfer->rx_buf; in pump_transfers()
664 drv_data->rx_end = drv_data->rx + transfer->len; in pump_transfers()
665 dev_dbg(&drv_data->pdev->dev, "rx_buf is %p, rx_end is %p\n", in pump_transfers()
666 transfer->rx_buf, drv_data->rx_end); in pump_transfers()
668 drv_data->rx = NULL; in pump_transfers()
671 drv_data->rx_dma = transfer->rx_dma; in pump_transfers()
672 drv_data->tx_dma = transfer->tx_dma; in pump_transfers()
673 drv_data->len_in_bytes = transfer->len; in pump_transfers()
674 drv_data->cs_change = transfer->cs_change; in pump_transfers()
679 drv_data->n_bytes = 1; in pump_transfers()
681 drv_data->read = chip->cs_change_per_word ? in pump_transfers()
683 drv_data->write = chip->cs_change_per_word ? in pump_transfers()
685 drv_data->duplex = chip->cs_change_per_word ? in pump_transfers()
690 drv_data->n_bytes = 2; in pump_transfers()
692 drv_data->read = chip->cs_change_per_word ? in pump_transfers()
694 drv_data->write = chip->cs_change_per_word ? in pump_transfers()
696 drv_data->duplex = chip->cs_change_per_word ? in pump_transfers()
702 drv_data->n_bytes = chip->n_bytes; in pump_transfers()
704 drv_data->write = drv_data->tx ? chip->write : null_writer; in pump_transfers()
705 drv_data->read = drv_data->rx ? chip->read : null_reader; in pump_transfers()
706 drv_data->duplex = chip->duplex ? chip->duplex : null_writer; in pump_transfers()
709 cr = (read_CTRL(drv_data) & (~BIT_CTL_TIMOD)); in pump_transfers()
711 write_CTRL(drv_data, cr); in pump_transfers()
714 drv_data->len = (transfer->len) >> 1; in pump_transfers()
716 drv_data->len = transfer->len; in pump_transfers()
718 dev_dbg(&drv_data->pdev->dev, in pump_transfers()
720 drv_data->write, chip->write, null_writer); in pump_transfers()
728 write_BAUD(drv_data, hz_to_spi_baud(transfer->speed_hz)); in pump_transfers()
730 write_BAUD(drv_data, chip->baud); in pump_transfers()
732 write_STAT(drv_data, BIT_STAT_CLR); in pump_transfers()
733 cr = (read_CTRL(drv_data) & (~BIT_CTL_TIMOD)); in pump_transfers()
734 cs_active(drv_data, chip); in pump_transfers()
736 dev_dbg(&drv_data->pdev->dev, in pump_transfers()
745 if (!full_duplex && drv_data->cur_chip->enable_dma in pump_transfers()
746 && drv_data->len > 6) { in pump_transfers()
748 disable_dma(drv_data->dma_channel); in pump_transfers()
749 clear_dma_irqstat(drv_data->dma_channel); in pump_transfers()
750 bfin_spi_disable(drv_data); in pump_transfers()
753 dev_dbg(&drv_data->pdev->dev, "doing dma transfer\n"); in pump_transfers()
755 set_dma_x_count(drv_data->dma_channel, drv_data->len); in pump_transfers()
756 set_dma_x_modify(drv_data->dma_channel, 2); in pump_transfers()
759 set_dma_x_count(drv_data->dma_channel, drv_data->len); in pump_transfers()
760 set_dma_x_modify(drv_data->dma_channel, 1); in pump_transfers()
765 while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) in pump_transfers()
769 if (drv_data->tx_dma == 0xFFFF) { in pump_transfers()
770 dev_dbg(&drv_data->pdev->dev, in pump_transfers()
776 set_dma_config(drv_data->dma_channel, dma_config); in pump_transfers()
777 set_dma_start_addr(drv_data->dma_channel, in pump_transfers()
778 (unsigned long)drv_data->tx); in pump_transfers()
779 enable_dma(drv_data->dma_channel); in pump_transfers()
782 write_CTRL(drv_data, in pump_transfers()
789 giveback(drv_data); in pump_transfers()
794 if (drv_data->rx != NULL) { in pump_transfers()
796 dev_dbg(&drv_data->pdev->dev, "doing DMA in.\n"); in pump_transfers()
799 write_TDBR(drv_data, 0xFFFF); in pump_transfers()
801 set_dma_x_count(drv_data->dma_channel, drv_data->len); in pump_transfers()
804 dma_enable_irq(drv_data->dma_channel); in pump_transfers()
806 set_dma_config(drv_data->dma_channel, dma_config); in pump_transfers()
807 set_dma_start_addr(drv_data->dma_channel, in pump_transfers()
808 (unsigned long)drv_data->rx); in pump_transfers()
809 enable_dma(drv_data->dma_channel); in pump_transfers()
812 write_CTRL(drv_data, in pump_transfers()
815 } else if (drv_data->tx != NULL) { in pump_transfers()
816 dev_dbg(&drv_data->pdev->dev, "doing DMA out.\n"); in pump_transfers()
819 dma_enable_irq(drv_data->dma_channel); in pump_transfers()
821 set_dma_config(drv_data->dma_channel, dma_config); in pump_transfers()
822 set_dma_start_addr(drv_data->dma_channel, in pump_transfers()
823 (unsigned long)drv_data->tx); in pump_transfers()
824 enable_dma(drv_data->dma_channel); in pump_transfers()
827 write_CTRL(drv_data, in pump_transfers()
832 dev_dbg(&drv_data->pdev->dev, "doing IO transfer\n"); in pump_transfers()
836 BUG_ON((drv_data->tx_end - drv_data->tx) != in pump_transfers()
837 (drv_data->rx_end - drv_data->rx)); in pump_transfers()
838 dev_dbg(&drv_data->pdev->dev, in pump_transfers()
842 write_CTRL(drv_data, (cr | CFG_SPI_WRITE)); in pump_transfers()
844 drv_data->duplex(drv_data); in pump_transfers()
846 if (drv_data->tx != drv_data->tx_end) in pump_transfers()
848 } else if (drv_data->tx != NULL) { in pump_transfers()
850 dev_dbg(&drv_data->pdev->dev, in pump_transfers()
854 write_CTRL(drv_data, (cr | CFG_SPI_WRITE)); in pump_transfers()
856 drv_data->write(drv_data); in pump_transfers()
858 if (drv_data->tx != drv_data->tx_end) in pump_transfers()
860 } else if (drv_data->rx != NULL) { in pump_transfers()
862 dev_dbg(&drv_data->pdev->dev, in pump_transfers()
866 write_CTRL(drv_data, (cr | CFG_SPI_READ)); in pump_transfers()
868 drv_data->read(drv_data); in pump_transfers()
869 if (drv_data->rx != drv_data->rx_end) in pump_transfers()
874 dev_dbg(&drv_data->pdev->dev, in pump_transfers()
879 message->actual_length += drv_data->len; in pump_transfers()
882 message->state = next_transfer(drv_data); in pump_transfers()
886 tasklet_schedule(&drv_data->pump_transfers); in pump_transfers()
894 struct driver_data *drv_data; in pump_messages() local
897 drv_data = container_of(work, struct driver_data, pump_messages); in pump_messages()
900 spin_lock_irqsave(&drv_data->lock, flags); in pump_messages()
901 if (list_empty(&drv_data->queue) || drv_data->run == QUEUE_STOPPED) { in pump_messages()
903 drv_data->busy = 0; in pump_messages()
904 spin_unlock_irqrestore(&drv_data->lock, flags); in pump_messages()
909 if (drv_data->cur_msg) { in pump_messages()
910 spin_unlock_irqrestore(&drv_data->lock, flags); in pump_messages()
915 drv_data->cur_msg = list_entry(drv_data->queue.next, in pump_messages()
919 drv_data->cur_chip = spi_get_ctldata(drv_data->cur_msg->spi); in pump_messages()
920 restore_state(drv_data); in pump_messages()
922 list_del_init(&drv_data->cur_msg->queue); in pump_messages()
925 drv_data->cur_msg->state = START_STATE; in pump_messages()
926 drv_data->cur_transfer = list_entry(drv_data->cur_msg->transfers.next, in pump_messages()
929 dev_dbg(&drv_data->pdev->dev, "got a message to pump, " in pump_messages()
931 drv_data->cur_chip->baud, drv_data->cur_chip->flag, in pump_messages()
932 drv_data->cur_chip->ctl_reg); in pump_messages()
934 dev_dbg(&drv_data->pdev->dev, in pump_messages()
936 drv_data->cur_transfer->len); in pump_messages()
939 tasklet_schedule(&drv_data->pump_transfers); in pump_messages()
941 drv_data->busy = 1; in pump_messages()
942 spin_unlock_irqrestore(&drv_data->lock, flags); in pump_messages()
951 struct driver_data *drv_data = spi_master_get_devdata(spi->master); in transfer() local
954 spin_lock_irqsave(&drv_data->lock, flags); in transfer()
956 if (drv_data->run == QUEUE_STOPPED) { in transfer()
957 spin_unlock_irqrestore(&drv_data->lock, flags); in transfer()
966 list_add_tail(&msg->queue, &drv_data->queue); in transfer()
968 if (drv_data->run == QUEUE_RUNNING && !drv_data->busy) in transfer()
969 queue_work(drv_data->workqueue, &drv_data->pump_messages); in transfer()
971 spin_unlock_irqrestore(&drv_data->lock, flags); in transfer()
997 struct driver_data *drv_data = spi_master_get_devdata(spi->master); in setup() local
1039 && drv_data->master_info->enable_dma; in setup()
1060 if (chip->enable_dma && !drv_data->dma_requested) { in setup()
1062 if (request_dma(drv_data->dma_channel, "BF53x_SPI_DMA") < 0) { in setup()
1067 if (set_dma_callback(drv_data->dma_channel, in setup()
1068 (void *)dma_irq_handler, drv_data) < 0) { in setup()
1072 dma_disable_irq(drv_data->dma_channel); in setup()
1073 drv_data->dma_requested = 1; in setup()
1128 cs_deactive(drv_data, chip); in setup()
1149 static inline int init_queue(struct driver_data *drv_data) in init_queue() argument
1151 INIT_LIST_HEAD(&drv_data->queue); in init_queue()
1152 spin_lock_init(&drv_data->lock); in init_queue()
1154 drv_data->run = QUEUE_STOPPED; in init_queue()
1155 drv_data->busy = 0; in init_queue()
1158 tasklet_init(&drv_data->pump_transfers, in init_queue()
1159 pump_transfers, (unsigned long)drv_data); in init_queue()
1162 INIT_WORK(&drv_data->pump_messages, pump_messages); in init_queue()
1163 drv_data->workqueue = in init_queue()
1164 create_singlethread_workqueue(drv_data->master->dev.parent->bus_id); in init_queue()
1165 if (drv_data->workqueue == NULL) in init_queue()
1171 static inline int start_queue(struct driver_data *drv_data) in start_queue() argument
1175 spin_lock_irqsave(&drv_data->lock, flags); in start_queue()
1177 if (drv_data->run == QUEUE_RUNNING || drv_data->busy) { in start_queue()
1178 spin_unlock_irqrestore(&drv_data->lock, flags); in start_queue()
1182 drv_data->run = QUEUE_RUNNING; in start_queue()
1183 drv_data->cur_msg = NULL; in start_queue()
1184 drv_data->cur_transfer = NULL; in start_queue()
1185 drv_data->cur_chip = NULL; in start_queue()
1186 spin_unlock_irqrestore(&drv_data->lock, flags); in start_queue()
1188 queue_work(drv_data->workqueue, &drv_data->pump_messages); in start_queue()
1193 static inline int stop_queue(struct driver_data *drv_data) in stop_queue() argument
1199 spin_lock_irqsave(&drv_data->lock, flags); in stop_queue()
1207 drv_data->run = QUEUE_STOPPED; in stop_queue()
1208 while (!list_empty(&drv_data->queue) && drv_data->busy && limit--) { in stop_queue()
1209 spin_unlock_irqrestore(&drv_data->lock, flags); in stop_queue()
1211 spin_lock_irqsave(&drv_data->lock, flags); in stop_queue()
1214 if (!list_empty(&drv_data->queue) || drv_data->busy) in stop_queue()
1217 spin_unlock_irqrestore(&drv_data->lock, flags); in stop_queue()
1222 static inline int destroy_queue(struct driver_data *drv_data) in destroy_queue() argument
1226 status = stop_queue(drv_data); in destroy_queue()
1230 destroy_workqueue(drv_data->workqueue); in destroy_queue()
1240 struct driver_data *drv_data = 0; in bfin5xx_spi_probe() local
1253 drv_data = spi_master_get_devdata(master); in bfin5xx_spi_probe()
1254 drv_data->master = master; in bfin5xx_spi_probe()
1255 drv_data->master_info = platform_info; in bfin5xx_spi_probe()
1256 drv_data->pdev = pdev; in bfin5xx_spi_probe()
1257 drv_data->pin_req = platform_info->pin_req; in bfin5xx_spi_probe()
1273 drv_data->regs_base = ioremap(res->start, (res->end - res->start + 1)); in bfin5xx_spi_probe()
1274 if (drv_data->regs_base == NULL) { in bfin5xx_spi_probe()
1280 drv_data->dma_channel = platform_get_irq(pdev, 0); in bfin5xx_spi_probe()
1281 if (drv_data->dma_channel < 0) { in bfin5xx_spi_probe()
1288 status = init_queue(drv_data); in bfin5xx_spi_probe()
1294 status = start_queue(drv_data); in bfin5xx_spi_probe()
1300 status = peripheral_request_list(drv_data->pin_req, DRV_NAME); in bfin5xx_spi_probe()
1307 platform_set_drvdata(pdev, drv_data); in bfin5xx_spi_probe()
1315 DRV_DESC, DRV_VERSION, drv_data->regs_base, in bfin5xx_spi_probe()
1316 drv_data->dma_channel); in bfin5xx_spi_probe()
1320 destroy_queue(drv_data); in bfin5xx_spi_probe()
1322 iounmap((void *) drv_data->regs_base); in bfin5xx_spi_probe()
1333 struct driver_data *drv_data = platform_get_drvdata(pdev); in bfin5xx_spi_remove() local
1336 if (!drv_data) in bfin5xx_spi_remove()
1340 status = destroy_queue(drv_data); in bfin5xx_spi_remove()
1345 bfin_spi_disable(drv_data); in bfin5xx_spi_remove()
1348 if (drv_data->master_info->enable_dma) { in bfin5xx_spi_remove()
1349 if (dma_channel_active(drv_data->dma_channel)) in bfin5xx_spi_remove()
1350 free_dma(drv_data->dma_channel); in bfin5xx_spi_remove()
1354 spi_unregister_master(drv_data->master); in bfin5xx_spi_remove()
1356 peripheral_free_list(drv_data->pin_req); in bfin5xx_spi_remove()
1367 struct driver_data *drv_data = platform_get_drvdata(pdev); in bfin5xx_spi_suspend() local
1370 status = stop_queue(drv_data); in bfin5xx_spi_suspend()
1375 bfin_spi_disable(drv_data); in bfin5xx_spi_suspend()
1382 struct driver_data *drv_data = platform_get_drvdata(pdev); in bfin5xx_spi_resume() local
1386 bfin_spi_enable(drv_data); in bfin5xx_spi_resume()
1389 status = start_queue(drv_data); in bfin5xx_spi_resume()