• Home
  • Raw
  • Download

Lines Matching refs:as

263 static bool atmel_spi_is_v2(struct atmel_spi *as)  in atmel_spi_is_v2()  argument
265 return as->caps.is_spi2; in atmel_spi_is_v2()
288 static void cs_activate(struct atmel_spi *as, struct spi_device *spi) in cs_activate() argument
294 if (atmel_spi_is_v2(as)) { in cs_activate()
295 spi_writel(as, CSR0 + 4 * spi->chip_select, asd->csr); in cs_activate()
299 spi_writel(as, CSR0, asd->csr); in cs_activate()
300 if (as->caps.has_wdrbt) { in cs_activate()
301 spi_writel(as, MR, in cs_activate()
307 spi_writel(as, MR, in cs_activate()
313 mr = spi_readl(as, MR); in cs_activate()
322 csr = spi_readl(as, CSR0 + 4 * i); in cs_activate()
324 spi_writel(as, CSR0 + 4 * i, in cs_activate()
328 mr = spi_readl(as, MR); in cs_activate()
332 spi_writel(as, MR, mr); in cs_activate()
340 static void cs_deactivate(struct atmel_spi *as, struct spi_device *spi) in cs_deactivate() argument
349 mr = spi_readl(as, MR); in cs_deactivate()
352 spi_writel(as, MR, mr); in cs_deactivate()
359 if (atmel_spi_is_v2(as) || spi->chip_select != 0) in cs_deactivate()
363 static void atmel_spi_lock(struct atmel_spi *as) in atmel_spi_lock() argument
365 spin_lock_irqsave(&as->lock, as->flags); in atmel_spi_lock()
368 static void atmel_spi_unlock(struct atmel_spi *as) in atmel_spi_unlock() argument
370 spin_unlock_irqrestore(&as->lock, as->flags); in atmel_spi_unlock()
373 static inline bool atmel_spi_use_dma(struct atmel_spi *as, in atmel_spi_use_dma() argument
376 return as->use_dma && xfer->len >= DMA_MIN_BYTES; in atmel_spi_use_dma()
390 static int atmel_spi_dma_slave_config(struct atmel_spi *as, in atmel_spi_dma_slave_config() argument
404 slave_config->dst_addr = (dma_addr_t)as->phybase + SPI_TDR; in atmel_spi_dma_slave_config()
405 slave_config->src_addr = (dma_addr_t)as->phybase + SPI_RDR; in atmel_spi_dma_slave_config()
411 if (dmaengine_slave_config(as->dma.chan_tx, slave_config)) { in atmel_spi_dma_slave_config()
412 dev_err(&as->pdev->dev, in atmel_spi_dma_slave_config()
418 if (dmaengine_slave_config(as->dma.chan_rx, slave_config)) { in atmel_spi_dma_slave_config()
419 dev_err(&as->pdev->dev, in atmel_spi_dma_slave_config()
439 static int atmel_spi_configure_dma(struct atmel_spi *as) in atmel_spi_configure_dma() argument
441 struct at_dma_slave *sdata = &as->dma.dma_slave; in atmel_spi_configure_dma()
451 as->dma.chan_tx = dma_request_channel(mask, filter, sdata); in atmel_spi_configure_dma()
452 if (as->dma.chan_tx) in atmel_spi_configure_dma()
453 as->dma.chan_rx = in atmel_spi_configure_dma()
456 if (!as->dma.chan_rx || !as->dma.chan_tx) { in atmel_spi_configure_dma()
457 dev_err(&as->pdev->dev, in atmel_spi_configure_dma()
463 err = atmel_spi_dma_slave_config(as, &slave_config, 8); in atmel_spi_configure_dma()
467 dev_info(&as->pdev->dev, in atmel_spi_configure_dma()
469 dma_chan_name(as->dma.chan_tx), in atmel_spi_configure_dma()
470 dma_chan_name(as->dma.chan_rx)); in atmel_spi_configure_dma()
473 if (as->dma.chan_rx) in atmel_spi_configure_dma()
474 dma_release_channel(as->dma.chan_rx); in atmel_spi_configure_dma()
475 if (as->dma.chan_tx) in atmel_spi_configure_dma()
476 dma_release_channel(as->dma.chan_tx); in atmel_spi_configure_dma()
480 static void atmel_spi_stop_dma(struct atmel_spi *as) in atmel_spi_stop_dma() argument
482 if (as->dma.chan_rx) in atmel_spi_stop_dma()
483 as->dma.chan_rx->device->device_control(as->dma.chan_rx, in atmel_spi_stop_dma()
485 if (as->dma.chan_tx) in atmel_spi_stop_dma()
486 as->dma.chan_tx->device->device_control(as->dma.chan_tx, in atmel_spi_stop_dma()
490 static void atmel_spi_release_dma(struct atmel_spi *as) in atmel_spi_release_dma() argument
492 if (as->dma.chan_rx) in atmel_spi_release_dma()
493 dma_release_channel(as->dma.chan_rx); in atmel_spi_release_dma()
494 if (as->dma.chan_tx) in atmel_spi_release_dma()
495 dma_release_channel(as->dma.chan_tx); in atmel_spi_release_dma()
502 struct atmel_spi *as = spi_master_get_devdata(master); in dma_callback() local
505 tasklet_schedule(&as->tasklet); in dma_callback()
515 struct atmel_spi *as = spi_master_get_devdata(master); in atmel_spi_next_xfer_pio() local
519 as->current_remaining_bytes = xfer->len; in atmel_spi_next_xfer_pio()
522 spi_readl(as, RDR); in atmel_spi_next_xfer_pio()
523 while (spi_readl(as, SR) & SPI_BIT(RDRF)) { in atmel_spi_next_xfer_pio()
524 spi_readl(as, RDR); in atmel_spi_next_xfer_pio()
530 spi_writel(as, TDR, *(u16 *)(xfer->tx_buf)); in atmel_spi_next_xfer_pio()
532 spi_writel(as, TDR, *(u8 *)(xfer->tx_buf)); in atmel_spi_next_xfer_pio()
534 spi_writel(as, TDR, 0); in atmel_spi_next_xfer_pio()
542 spi_writel(as, IER, SPI_BIT(RDRF) | SPI_BIT(OVRES)); in atmel_spi_next_xfer_pio()
553 struct atmel_spi *as = spi_master_get_devdata(master); in atmel_spi_next_xfer_dma_submit() local
554 struct dma_chan *rxchan = as->dma.chan_rx; in atmel_spi_next_xfer_dma_submit()
555 struct dma_chan *txchan = as->dma.chan_tx; in atmel_spi_next_xfer_dma_submit()
569 atmel_spi_unlock(as); in atmel_spi_next_xfer_dma_submit()
572 sg_init_table(&as->dma.sgrx, 1); in atmel_spi_next_xfer_dma_submit()
574 as->dma.sgrx.dma_address = xfer->rx_dma + xfer->len - *plen; in atmel_spi_next_xfer_dma_submit()
576 as->dma.sgrx.dma_address = as->buffer_dma; in atmel_spi_next_xfer_dma_submit()
582 sg_init_table(&as->dma.sgtx, 1); in atmel_spi_next_xfer_dma_submit()
584 as->dma.sgtx.dma_address = xfer->tx_dma + xfer->len - *plen; in atmel_spi_next_xfer_dma_submit()
586 as->dma.sgtx.dma_address = as->buffer_dma; in atmel_spi_next_xfer_dma_submit()
589 memset(as->buffer, 0, len); in atmel_spi_next_xfer_dma_submit()
592 sg_dma_len(&as->dma.sgtx) = len; in atmel_spi_next_xfer_dma_submit()
593 sg_dma_len(&as->dma.sgrx) = len; in atmel_spi_next_xfer_dma_submit()
597 if (atmel_spi_dma_slave_config(as, &slave_config, 8)) in atmel_spi_next_xfer_dma_submit()
602 &as->dma.sgrx, in atmel_spi_next_xfer_dma_submit()
611 &as->dma.sgtx, in atmel_spi_next_xfer_dma_submit()
625 spi_writel(as, IER, SPI_BIT(OVRES)); in atmel_spi_next_xfer_dma_submit()
642 atmel_spi_lock(as); in atmel_spi_next_xfer_dma_submit()
646 spi_writel(as, IDR, SPI_BIT(OVRES)); in atmel_spi_next_xfer_dma_submit()
647 atmel_spi_stop_dma(as); in atmel_spi_next_xfer_dma_submit()
649 atmel_spi_lock(as); in atmel_spi_next_xfer_dma_submit()
659 struct atmel_spi *as = spi_master_get_devdata(master); in atmel_spi_next_xfer_data() local
666 *rx_dma = as->buffer_dma; in atmel_spi_next_xfer_data()
674 *tx_dma = as->buffer_dma; in atmel_spi_next_xfer_data()
677 memset(as->buffer, 0, len); in atmel_spi_next_xfer_data()
678 dma_sync_single_for_device(&as->pdev->dev, in atmel_spi_next_xfer_data()
679 as->buffer_dma, len, DMA_TO_DEVICE); in atmel_spi_next_xfer_data()
692 struct atmel_spi *as = spi_master_get_devdata(master); in atmel_spi_pdc_next_xfer() local
698 if (!as->current_transfer) in atmel_spi_pdc_next_xfer()
701 else if (!as->next_transfer) in atmel_spi_pdc_next_xfer()
702 xfer = list_entry(as->current_transfer->transfer_list.next, in atmel_spi_pdc_next_xfer()
708 spi_writel(as, PTCR, SPI_BIT(RXTDIS) | SPI_BIT(TXTDIS)); in atmel_spi_pdc_next_xfer()
714 spi_writel(as, RPR, rx_dma); in atmel_spi_pdc_next_xfer()
715 spi_writel(as, TPR, tx_dma); in atmel_spi_pdc_next_xfer()
719 spi_writel(as, RCR, len); in atmel_spi_pdc_next_xfer()
720 spi_writel(as, TCR, len); in atmel_spi_pdc_next_xfer()
727 xfer = as->next_transfer; in atmel_spi_pdc_next_xfer()
728 remaining = as->next_remaining_bytes; in atmel_spi_pdc_next_xfer()
731 as->current_transfer = xfer; in atmel_spi_pdc_next_xfer()
732 as->current_remaining_bytes = remaining; in atmel_spi_pdc_next_xfer()
744 as->next_transfer = xfer; in atmel_spi_pdc_next_xfer()
751 as->next_remaining_bytes = total - len; in atmel_spi_pdc_next_xfer()
753 spi_writel(as, RNPR, rx_dma); in atmel_spi_pdc_next_xfer()
754 spi_writel(as, TNPR, tx_dma); in atmel_spi_pdc_next_xfer()
758 spi_writel(as, RNCR, len); in atmel_spi_pdc_next_xfer()
759 spi_writel(as, TNCR, len); in atmel_spi_pdc_next_xfer()
767 spi_writel(as, RNCR, 0); in atmel_spi_pdc_next_xfer()
768 spi_writel(as, TNCR, 0); in atmel_spi_pdc_next_xfer()
782 spi_writel(as, IER, ieval); in atmel_spi_pdc_next_xfer()
783 spi_writel(as, PTCR, SPI_BIT(TXTEN) | SPI_BIT(RXTEN)); in atmel_spi_pdc_next_xfer()
793 struct atmel_spi *as = spi_master_get_devdata(master); in atmel_spi_dma_next_xfer() local
797 remaining = as->current_remaining_bytes; in atmel_spi_dma_next_xfer()
799 xfer = as->current_transfer; in atmel_spi_dma_next_xfer()
802 if (!as->current_transfer) in atmel_spi_dma_next_xfer()
807 as->current_transfer->transfer_list.next, in atmel_spi_dma_next_xfer()
810 as->current_transfer = xfer; in atmel_spi_dma_next_xfer()
814 if (atmel_spi_use_dma(as, xfer)) { in atmel_spi_dma_next_xfer()
817 as->current_remaining_bytes = total - len; in atmel_spi_dma_next_xfer()
830 struct atmel_spi *as = spi_master_get_devdata(master); in atmel_spi_next_message() local
834 BUG_ON(as->current_transfer); in atmel_spi_next_message()
836 msg = list_entry(as->queue.next, struct spi_message, queue); in atmel_spi_next_message()
843 if (as->stay) { in atmel_spi_next_message()
844 if (as->stay != spi) { in atmel_spi_next_message()
845 cs_deactivate(as, as->stay); in atmel_spi_next_message()
846 cs_activate(as, spi); in atmel_spi_next_message()
848 as->stay = NULL; in atmel_spi_next_message()
850 cs_activate(as, spi); in atmel_spi_next_message()
852 if (as->use_pdc) in atmel_spi_next_message()
866 atmel_spi_dma_map_xfer(struct atmel_spi *as, struct spi_transfer *xfer) in atmel_spi_dma_map_xfer() argument
868 struct device *dev = &as->pdev->dev; in atmel_spi_dma_map_xfer()
908 static void atmel_spi_disable_pdc_transfer(struct atmel_spi *as) in atmel_spi_disable_pdc_transfer() argument
910 spi_writel(as, PTCR, SPI_BIT(RXTDIS) | SPI_BIT(TXTDIS)); in atmel_spi_disable_pdc_transfer()
914 atmel_spi_msg_done(struct spi_master *master, struct atmel_spi *as, in atmel_spi_msg_done() argument
917 if (!stay || as->done_status < 0) in atmel_spi_msg_done()
918 cs_deactivate(as, msg->spi); in atmel_spi_msg_done()
920 as->stay = msg->spi; in atmel_spi_msg_done()
923 msg->status = as->done_status; in atmel_spi_msg_done()
929 atmel_spi_unlock(as); in atmel_spi_msg_done()
931 atmel_spi_lock(as); in atmel_spi_msg_done()
933 as->current_transfer = NULL; in atmel_spi_msg_done()
934 as->next_transfer = NULL; in atmel_spi_msg_done()
935 as->done_status = 0; in atmel_spi_msg_done()
938 if (list_empty(&as->queue) || as->stopping) { in atmel_spi_msg_done()
939 if (as->use_pdc) in atmel_spi_msg_done()
940 atmel_spi_disable_pdc_transfer(as); in atmel_spi_msg_done()
953 atmel_spi_pump_pio_data(struct atmel_spi *as, struct spi_transfer *xfer) in atmel_spi_pump_pio_data() argument
959 unsigned long xfer_pos = xfer->len - as->current_remaining_bytes; in atmel_spi_pump_pio_data()
964 *rxp16 = spi_readl(as, RDR); in atmel_spi_pump_pio_data()
967 *rxp = spi_readl(as, RDR); in atmel_spi_pump_pio_data()
970 spi_readl(as, RDR); in atmel_spi_pump_pio_data()
973 as->current_remaining_bytes -= 2; in atmel_spi_pump_pio_data()
974 if (as->current_remaining_bytes < 0) in atmel_spi_pump_pio_data()
975 as->current_remaining_bytes = 0; in atmel_spi_pump_pio_data()
977 as->current_remaining_bytes--; in atmel_spi_pump_pio_data()
980 if (as->current_remaining_bytes) { in atmel_spi_pump_pio_data()
985 spi_writel(as, TDR, *txp16); in atmel_spi_pump_pio_data()
988 spi_writel(as, TDR, *txp); in atmel_spi_pump_pio_data()
991 spi_writel(as, TDR, 0); in atmel_spi_pump_pio_data()
1002 struct atmel_spi *as = spi_master_get_devdata(master); in atmel_spi_tasklet_func() local
1008 atmel_spi_lock(as); in atmel_spi_tasklet_func()
1010 xfer = as->current_transfer; in atmel_spi_tasklet_func()
1016 msg = list_entry(as->queue.next, struct spi_message, queue); in atmel_spi_tasklet_func()
1018 if (as->current_remaining_bytes == 0) { in atmel_spi_tasklet_func()
1019 if (as->done_status < 0) { in atmel_spi_tasklet_func()
1021 if (atmel_spi_use_dma(as, xfer)) in atmel_spi_tasklet_func()
1022 atmel_spi_stop_dma(as); in atmel_spi_tasklet_func()
1028 if (atmel_spi_use_dma(as, xfer)) in atmel_spi_tasklet_func()
1035 if (atmel_spi_xfer_is_last(msg, xfer) || as->done_status < 0) { in atmel_spi_tasklet_func()
1037 atmel_spi_msg_done(master, as, msg, xfer->cs_change); in atmel_spi_tasklet_func()
1040 cs_deactivate(as, msg->spi); in atmel_spi_tasklet_func()
1042 cs_activate(as, msg->spi); in atmel_spi_tasklet_func()
1061 atmel_spi_unlock(as); in atmel_spi_tasklet_func()
1074 struct atmel_spi *as = spi_master_get_devdata(master); in atmel_spi_pio_interrupt() local
1079 imr = spi_readl(as, IMR); in atmel_spi_pio_interrupt()
1080 status = spi_readl(as, SR); in atmel_spi_pio_interrupt()
1085 spi_writel(as, IDR, SPI_BIT(OVRES)); in atmel_spi_pio_interrupt()
1099 as->done_status = -EIO; in atmel_spi_pio_interrupt()
1103 spi_readl(as, SR); in atmel_spi_pio_interrupt()
1105 tasklet_schedule(&as->tasklet); in atmel_spi_pio_interrupt()
1108 atmel_spi_lock(as); in atmel_spi_pio_interrupt()
1110 if (as->current_remaining_bytes) { in atmel_spi_pio_interrupt()
1112 xfer = as->current_transfer; in atmel_spi_pio_interrupt()
1113 atmel_spi_pump_pio_data(as, xfer); in atmel_spi_pio_interrupt()
1114 if (!as->current_remaining_bytes) { in atmel_spi_pio_interrupt()
1116 spi_writel(as, IDR, pending); in atmel_spi_pio_interrupt()
1117 tasklet_schedule(&as->tasklet); in atmel_spi_pio_interrupt()
1121 atmel_spi_unlock(as); in atmel_spi_pio_interrupt()
1125 spi_writel(as, IDR, pending); in atmel_spi_pio_interrupt()
1135 struct atmel_spi *as = spi_master_get_devdata(master); in atmel_spi_pdc_interrupt() local
1141 atmel_spi_lock(as); in atmel_spi_pdc_interrupt()
1143 xfer = as->current_transfer; in atmel_spi_pdc_interrupt()
1144 msg = list_entry(as->queue.next, struct spi_message, queue); in atmel_spi_pdc_interrupt()
1146 imr = spi_readl(as, IMR); in atmel_spi_pdc_interrupt()
1147 status = spi_readl(as, SR); in atmel_spi_pdc_interrupt()
1155 spi_writel(as, IDR, (SPI_BIT(RXBUFF) | SPI_BIT(ENDRX) in atmel_spi_pdc_interrupt()
1169 spi_writel(as, PTCR, SPI_BIT(RXTDIS) | SPI_BIT(TXTDIS)); in atmel_spi_pdc_interrupt()
1178 spi_readl(as, TCR), spi_readl(as, RCR)); in atmel_spi_pdc_interrupt()
1184 spi_writel(as, RNCR, 0); in atmel_spi_pdc_interrupt()
1185 spi_writel(as, TNCR, 0); in atmel_spi_pdc_interrupt()
1186 spi_writel(as, RCR, 0); in atmel_spi_pdc_interrupt()
1187 spi_writel(as, TCR, 0); in atmel_spi_pdc_interrupt()
1189 if (spi_readl(as, SR) & SPI_BIT(TXEMPTY)) in atmel_spi_pdc_interrupt()
1194 while (spi_readl(as, SR) & SPI_BIT(RDRF)) in atmel_spi_pdc_interrupt()
1195 spi_readl(as, RDR); in atmel_spi_pdc_interrupt()
1198 spi_readl(as, SR); in atmel_spi_pdc_interrupt()
1200 as->done_status = -EIO; in atmel_spi_pdc_interrupt()
1201 atmel_spi_msg_done(master, as, msg, 0); in atmel_spi_pdc_interrupt()
1205 spi_writel(as, IDR, pending); in atmel_spi_pdc_interrupt()
1207 if (as->current_remaining_bytes == 0) { in atmel_spi_pdc_interrupt()
1219 atmel_spi_msg_done(master, as, msg, in atmel_spi_pdc_interrupt()
1223 cs_deactivate(as, msg->spi); in atmel_spi_pdc_interrupt()
1225 cs_activate(as, msg->spi); in atmel_spi_pdc_interrupt()
1244 atmel_spi_unlock(as); in atmel_spi_pdc_interrupt()
1251 struct atmel_spi *as; in atmel_spi_setup() local
1259 as = spi_master_get_devdata(spi->master); in atmel_spi_setup()
1261 if (as->stopping) in atmel_spi_setup()
1279 if (!atmel_spi_is_v2(as) in atmel_spi_setup()
1287 bus_hz = clk_get_rate(as->clk); in atmel_spi_setup()
1288 if (!atmel_spi_is_v2(as)) in atmel_spi_setup()
1349 atmel_spi_lock(as); in atmel_spi_setup()
1350 if (as->stay == spi) in atmel_spi_setup()
1351 as->stay = NULL; in atmel_spi_setup()
1352 cs_deactivate(as, spi); in atmel_spi_setup()
1353 atmel_spi_unlock(as); in atmel_spi_setup()
1362 if (!atmel_spi_is_v2(as)) in atmel_spi_setup()
1363 spi_writel(as, CSR0 + 4 * spi->chip_select, csr); in atmel_spi_setup()
1370 struct atmel_spi *as; in atmel_spi_transfer() local
1376 as = spi_master_get_devdata(spi->master); in atmel_spi_transfer()
1384 if (as->stopping) in atmel_spi_transfer()
1420 if ((!msg->is_dma_mapped) && (atmel_spi_use_dma(as, xfer) in atmel_spi_transfer()
1421 || as->use_pdc)) { in atmel_spi_transfer()
1422 if (atmel_spi_dma_map_xfer(as, xfer) < 0) in atmel_spi_transfer()
1440 atmel_spi_lock(as); in atmel_spi_transfer()
1441 list_add_tail(&msg->queue, &as->queue); in atmel_spi_transfer()
1442 if (!as->current_transfer) in atmel_spi_transfer()
1444 atmel_spi_unlock(as); in atmel_spi_transfer()
1451 struct atmel_spi *as = spi_master_get_devdata(spi->master); in atmel_spi_cleanup() local
1458 atmel_spi_lock(as); in atmel_spi_cleanup()
1459 if (as->stay == spi) { in atmel_spi_cleanup()
1460 as->stay = NULL; in atmel_spi_cleanup()
1461 cs_deactivate(as, spi); in atmel_spi_cleanup()
1463 atmel_spi_unlock(as); in atmel_spi_cleanup()
1470 static inline unsigned int atmel_get_version(struct atmel_spi *as) in atmel_get_version() argument
1472 return spi_readl(as, VERSION) & 0x00000fff; in atmel_get_version()
1475 static void atmel_get_caps(struct atmel_spi *as) in atmel_get_caps() argument
1479 version = atmel_get_version(as); in atmel_get_caps()
1480 dev_info(&as->pdev->dev, "version: 0x%x\n", version); in atmel_get_caps()
1482 as->caps.is_spi2 = version > 0x121; in atmel_get_caps()
1483 as->caps.has_wdrbt = version >= 0x210; in atmel_get_caps()
1484 as->caps.has_dma_support = version >= 0x212; in atmel_get_caps()
1496 struct atmel_spi *as; in atmel_spi_probe() local
1512 master = spi_alloc_master(&pdev->dev, sizeof *as); in atmel_spi_probe()
1527 as = spi_master_get_devdata(master); in atmel_spi_probe()
1533 as->buffer = dma_alloc_coherent(&pdev->dev, BUFFER_SIZE, in atmel_spi_probe()
1534 &as->buffer_dma, GFP_KERNEL); in atmel_spi_probe()
1535 if (!as->buffer) in atmel_spi_probe()
1538 spin_lock_init(&as->lock); in atmel_spi_probe()
1539 INIT_LIST_HEAD(&as->queue); in atmel_spi_probe()
1541 as->pdev = pdev; in atmel_spi_probe()
1542 as->regs = ioremap(regs->start, resource_size(regs)); in atmel_spi_probe()
1543 if (!as->regs) in atmel_spi_probe()
1545 as->phybase = regs->start; in atmel_spi_probe()
1546 as->irq = irq; in atmel_spi_probe()
1547 as->clk = clk; in atmel_spi_probe()
1549 atmel_get_caps(as); in atmel_spi_probe()
1551 as->use_dma = false; in atmel_spi_probe()
1552 as->use_pdc = false; in atmel_spi_probe()
1553 if (as->caps.has_dma_support) { in atmel_spi_probe()
1554 if (atmel_spi_configure_dma(as) == 0) in atmel_spi_probe()
1555 as->use_dma = true; in atmel_spi_probe()
1557 as->use_pdc = true; in atmel_spi_probe()
1560 if (as->caps.has_dma_support && !as->use_dma) in atmel_spi_probe()
1563 if (as->use_pdc) { in atmel_spi_probe()
1567 tasklet_init(&as->tasklet, atmel_spi_tasklet_func, in atmel_spi_probe()
1578 spi_writel(as, CR, SPI_BIT(SWRST)); in atmel_spi_probe()
1579 spi_writel(as, CR, SPI_BIT(SWRST)); /* AT91SAM9263 Rev B workaround */ in atmel_spi_probe()
1580 if (as->caps.has_wdrbt) { in atmel_spi_probe()
1581 spi_writel(as, MR, SPI_BIT(WDRBT) | SPI_BIT(MODFDIS) in atmel_spi_probe()
1584 spi_writel(as, MR, SPI_BIT(MSTR) | SPI_BIT(MODFDIS)); in atmel_spi_probe()
1587 if (as->use_pdc) in atmel_spi_probe()
1588 spi_writel(as, PTCR, SPI_BIT(RXTDIS) | SPI_BIT(TXTDIS)); in atmel_spi_probe()
1589 spi_writel(as, CR, SPI_BIT(SPIEN)); in atmel_spi_probe()
1602 if (as->use_dma) in atmel_spi_probe()
1603 atmel_spi_release_dma(as); in atmel_spi_probe()
1605 spi_writel(as, CR, SPI_BIT(SWRST)); in atmel_spi_probe()
1606 spi_writel(as, CR, SPI_BIT(SWRST)); /* AT91SAM9263 Rev B workaround */ in atmel_spi_probe()
1610 iounmap(as->regs); in atmel_spi_probe()
1612 if (!as->use_pdc) in atmel_spi_probe()
1613 tasklet_kill(&as->tasklet); in atmel_spi_probe()
1614 dma_free_coherent(&pdev->dev, BUFFER_SIZE, as->buffer, in atmel_spi_probe()
1615 as->buffer_dma); in atmel_spi_probe()
1625 struct atmel_spi *as = spi_master_get_devdata(master); in atmel_spi_remove() local
1630 spin_lock_irq(&as->lock); in atmel_spi_remove()
1631 as->stopping = 1; in atmel_spi_remove()
1632 if (as->use_dma) { in atmel_spi_remove()
1633 atmel_spi_stop_dma(as); in atmel_spi_remove()
1634 atmel_spi_release_dma(as); in atmel_spi_remove()
1637 spi_writel(as, CR, SPI_BIT(SWRST)); in atmel_spi_remove()
1638 spi_writel(as, CR, SPI_BIT(SWRST)); /* AT91SAM9263 Rev B workaround */ in atmel_spi_remove()
1639 spi_readl(as, SR); in atmel_spi_remove()
1640 spin_unlock_irq(&as->lock); in atmel_spi_remove()
1643 list_for_each_entry(msg, &as->queue, queue) { in atmel_spi_remove()
1646 && (atmel_spi_use_dma(as, xfer) in atmel_spi_remove()
1647 || as->use_pdc)) in atmel_spi_remove()
1654 if (!as->use_pdc) in atmel_spi_remove()
1655 tasklet_kill(&as->tasklet); in atmel_spi_remove()
1656 dma_free_coherent(&pdev->dev, BUFFER_SIZE, as->buffer, in atmel_spi_remove()
1657 as->buffer_dma); in atmel_spi_remove()
1659 clk_disable(as->clk); in atmel_spi_remove()
1660 clk_put(as->clk); in atmel_spi_remove()
1661 free_irq(as->irq, master); in atmel_spi_remove()
1662 iounmap(as->regs); in atmel_spi_remove()
1674 struct atmel_spi *as = spi_master_get_devdata(master); in atmel_spi_suspend() local
1676 clk_disable(as->clk); in atmel_spi_suspend()
1683 struct atmel_spi *as = spi_master_get_devdata(master); in atmel_spi_resume() local
1685 clk_enable(as->clk); in atmel_spi_resume()