Lines Matching refs:hw

61 	void (*rx_word)(struct au1550_spi *hw);
62 void (*tx_word)(struct au1550_spi *hw);
64 irqreturn_t (*irq_callback)(struct au1550_spi *hw);
99 static void au1550_spi_bits_handlers_set(struct au1550_spi *hw, int bpw);
111 static u32 au1550_spi_baudcfg(struct au1550_spi *hw, unsigned speed_hz) in au1550_spi_baudcfg() argument
113 u32 mainclk_hz = hw->pdata->mainclk_hz; in au1550_spi_baudcfg()
134 static inline void au1550_spi_mask_ack_all(struct au1550_spi *hw) in au1550_spi_mask_ack_all() argument
136 hw->regs->psc_spimsk = in au1550_spi_mask_ack_all()
142 hw->regs->psc_spievent = in au1550_spi_mask_ack_all()
149 static void au1550_spi_reset_fifos(struct au1550_spi *hw) in au1550_spi_reset_fifos() argument
153 hw->regs->psc_spipcr = PSC_SPIPCR_RC | PSC_SPIPCR_TC; in au1550_spi_reset_fifos()
156 pcr = hw->regs->psc_spipcr; in au1550_spi_reset_fifos()
172 struct au1550_spi *hw = spi_master_get_devdata(spi->master); in au1550_spi_chipsel() local
178 if (hw->pdata->deactivate_cs) in au1550_spi_chipsel()
179 hw->pdata->deactivate_cs(hw->pdata, spi->chip_select, in au1550_spi_chipsel()
184 au1550_spi_bits_handlers_set(hw, spi->bits_per_word); in au1550_spi_chipsel()
186 cfg = hw->regs->psc_spicfg; in au1550_spi_chipsel()
188 hw->regs->psc_spicfg = cfg & ~PSC_SPICFG_DE_ENABLE; in au1550_spi_chipsel()
205 if (hw->usedma && spi->bits_per_word <= 8) in au1550_spi_chipsel()
214 cfg |= au1550_spi_baudcfg(hw, spi->max_speed_hz); in au1550_spi_chipsel()
216 hw->regs->psc_spicfg = cfg | PSC_SPICFG_DE_ENABLE; in au1550_spi_chipsel()
219 stat = hw->regs->psc_spistat; in au1550_spi_chipsel()
223 if (hw->pdata->activate_cs) in au1550_spi_chipsel()
224 hw->pdata->activate_cs(hw->pdata, spi->chip_select, in au1550_spi_chipsel()
232 struct au1550_spi *hw = spi_master_get_devdata(spi->master); in au1550_spi_setupxfer() local
248 au1550_spi_bits_handlers_set(hw, spi->bits_per_word); in au1550_spi_setupxfer()
250 cfg = hw->regs->psc_spicfg; in au1550_spi_setupxfer()
252 hw->regs->psc_spicfg = cfg & ~PSC_SPICFG_DE_ENABLE; in au1550_spi_setupxfer()
255 if (hw->usedma && bpw <= 8) in au1550_spi_setupxfer()
264 cfg |= au1550_spi_baudcfg(hw, hz); in au1550_spi_setupxfer()
266 hw->regs->psc_spicfg = cfg; in au1550_spi_setupxfer()
271 stat = hw->regs->psc_spistat; in au1550_spi_setupxfer()
276 au1550_spi_reset_fifos(hw); in au1550_spi_setupxfer()
277 au1550_spi_mask_ack_all(hw); in au1550_spi_setupxfer()
289 static int au1550_spi_dma_rxtmp_alloc(struct au1550_spi *hw, unsigned size) in au1550_spi_dma_rxtmp_alloc() argument
291 hw->dma_rx_tmpbuf = kmalloc(size, GFP_KERNEL); in au1550_spi_dma_rxtmp_alloc()
292 if (!hw->dma_rx_tmpbuf) in au1550_spi_dma_rxtmp_alloc()
294 hw->dma_rx_tmpbuf_size = size; in au1550_spi_dma_rxtmp_alloc()
295 hw->dma_rx_tmpbuf_addr = dma_map_single(hw->dev, hw->dma_rx_tmpbuf, in au1550_spi_dma_rxtmp_alloc()
297 if (dma_mapping_error(hw->dev, hw->dma_rx_tmpbuf_addr)) { in au1550_spi_dma_rxtmp_alloc()
298 kfree(hw->dma_rx_tmpbuf); in au1550_spi_dma_rxtmp_alloc()
299 hw->dma_rx_tmpbuf = 0; in au1550_spi_dma_rxtmp_alloc()
300 hw->dma_rx_tmpbuf_size = 0; in au1550_spi_dma_rxtmp_alloc()
306 static void au1550_spi_dma_rxtmp_free(struct au1550_spi *hw) in au1550_spi_dma_rxtmp_free() argument
308 dma_unmap_single(hw->dev, hw->dma_rx_tmpbuf_addr, in au1550_spi_dma_rxtmp_free()
309 hw->dma_rx_tmpbuf_size, DMA_FROM_DEVICE); in au1550_spi_dma_rxtmp_free()
310 kfree(hw->dma_rx_tmpbuf); in au1550_spi_dma_rxtmp_free()
311 hw->dma_rx_tmpbuf = 0; in au1550_spi_dma_rxtmp_free()
312 hw->dma_rx_tmpbuf_size = 0; in au1550_spi_dma_rxtmp_free()
317 struct au1550_spi *hw = spi_master_get_devdata(spi->master); in au1550_spi_dma_txrxb() local
322 hw->len = t->len; in au1550_spi_dma_txrxb()
323 hw->tx_count = 0; in au1550_spi_dma_txrxb()
324 hw->rx_count = 0; in au1550_spi_dma_txrxb()
326 hw->tx = t->tx_buf; in au1550_spi_dma_txrxb()
327 hw->rx = t->rx_buf; in au1550_spi_dma_txrxb()
341 dma_tx_addr = dma_map_single(hw->dev, in au1550_spi_dma_txrxb()
344 if (dma_mapping_error(hw->dev, dma_tx_addr)) in au1550_spi_dma_txrxb()
345 dev_err(hw->dev, "tx dma map error\n"); in au1550_spi_dma_txrxb()
351 dma_rx_addr = dma_map_single(hw->dev, in au1550_spi_dma_txrxb()
354 if (dma_mapping_error(hw->dev, dma_rx_addr)) in au1550_spi_dma_txrxb()
355 dev_err(hw->dev, "rx dma map error\n"); in au1550_spi_dma_txrxb()
358 if (t->len > hw->dma_rx_tmpbuf_size) { in au1550_spi_dma_txrxb()
361 au1550_spi_dma_rxtmp_free(hw); in au1550_spi_dma_txrxb()
362 ret = au1550_spi_dma_rxtmp_alloc(hw, max(t->len, in au1550_spi_dma_txrxb()
367 hw->rx = hw->dma_rx_tmpbuf; in au1550_spi_dma_txrxb()
368 dma_rx_addr = hw->dma_rx_tmpbuf_addr; in au1550_spi_dma_txrxb()
369 dma_sync_single_for_device(hw->dev, dma_rx_addr, in au1550_spi_dma_txrxb()
374 dma_sync_single_for_device(hw->dev, dma_rx_addr, in au1550_spi_dma_txrxb()
376 hw->tx = hw->rx; in au1550_spi_dma_txrxb()
380 res = au1xxx_dbdma_put_dest(hw->dma_rx_ch, virt_to_phys(hw->rx), in au1550_spi_dma_txrxb()
383 dev_err(hw->dev, "rx dma put dest error\n"); in au1550_spi_dma_txrxb()
385 res = au1xxx_dbdma_put_source(hw->dma_tx_ch, virt_to_phys(hw->tx), in au1550_spi_dma_txrxb()
388 dev_err(hw->dev, "tx dma put source error\n"); in au1550_spi_dma_txrxb()
390 au1xxx_dbdma_start(hw->dma_rx_ch); in au1550_spi_dma_txrxb()
391 au1xxx_dbdma_start(hw->dma_tx_ch); in au1550_spi_dma_txrxb()
394 hw->regs->psc_spimsk = PSC_SPIMSK_SD; in au1550_spi_dma_txrxb()
398 hw->regs->psc_spipcr = PSC_SPIPCR_MS; in au1550_spi_dma_txrxb()
401 wait_for_completion(&hw->master_done); in au1550_spi_dma_txrxb()
403 au1xxx_dbdma_stop(hw->dma_tx_ch); in au1550_spi_dma_txrxb()
404 au1xxx_dbdma_stop(hw->dma_rx_ch); in au1550_spi_dma_txrxb()
408 dma_sync_single_for_cpu(hw->dev, dma_rx_addr, t->len, in au1550_spi_dma_txrxb()
413 dma_unmap_single(hw->dev, dma_rx_addr, t->len, in au1550_spi_dma_txrxb()
416 dma_unmap_single(hw->dev, dma_tx_addr, t->len, in au1550_spi_dma_txrxb()
419 return hw->rx_count < hw->tx_count ? hw->rx_count : hw->tx_count; in au1550_spi_dma_txrxb()
422 static irqreturn_t au1550_spi_dma_irq_callback(struct au1550_spi *hw) in au1550_spi_dma_irq_callback() argument
426 stat = hw->regs->psc_spistat; in au1550_spi_dma_irq_callback()
427 evnt = hw->regs->psc_spievent; in au1550_spi_dma_irq_callback()
430 dev_err(hw->dev, "Unexpected IRQ!\n"); in au1550_spi_dma_irq_callback()
443 au1550_spi_mask_ack_all(hw); in au1550_spi_dma_irq_callback()
444 au1xxx_dbdma_stop(hw->dma_rx_ch); in au1550_spi_dma_irq_callback()
445 au1xxx_dbdma_stop(hw->dma_tx_ch); in au1550_spi_dma_irq_callback()
448 hw->rx_count = hw->len - au1xxx_get_dma_residue(hw->dma_rx_ch); in au1550_spi_dma_irq_callback()
449 hw->tx_count = hw->len - au1xxx_get_dma_residue(hw->dma_tx_ch); in au1550_spi_dma_irq_callback()
451 au1xxx_dbdma_reset(hw->dma_rx_ch); in au1550_spi_dma_irq_callback()
452 au1xxx_dbdma_reset(hw->dma_tx_ch); in au1550_spi_dma_irq_callback()
453 au1550_spi_reset_fifos(hw); in au1550_spi_dma_irq_callback()
456 dev_err(hw->dev, in au1550_spi_dma_irq_callback()
459 dev_err(hw->dev, in au1550_spi_dma_irq_callback()
463 complete(&hw->master_done); in au1550_spi_dma_irq_callback()
469 au1550_spi_mask_ack_all(hw); in au1550_spi_dma_irq_callback()
470 hw->rx_count = hw->len; in au1550_spi_dma_irq_callback()
471 hw->tx_count = hw->len; in au1550_spi_dma_irq_callback()
472 complete(&hw->master_done); in au1550_spi_dma_irq_callback()
480 static void au1550_spi_rx_word_##size(struct au1550_spi *hw) \
482 u32 fifoword = hw->regs->psc_spitxrx & (u32)(mask); \
484 if (hw->rx) { \
485 *(u##size *)hw->rx = (u##size)fifoword; \
486 hw->rx += (size) / 8; \
488 hw->rx_count += (size) / 8; \
492 static void au1550_spi_tx_word_##size(struct au1550_spi *hw) \
495 if (hw->tx) { \
496 fifoword = *(u##size *)hw->tx & (u32)(mask); \
497 hw->tx += (size) / 8; \
499 hw->tx_count += (size) / 8; \
500 if (hw->tx_count >= hw->len) \
502 hw->regs->psc_spitxrx = fifoword; \
516 struct au1550_spi *hw = spi_master_get_devdata(spi->master); in au1550_spi_pio_txrxb() local
518 hw->tx = t->tx_buf; in au1550_spi_pio_txrxb()
519 hw->rx = t->rx_buf; in au1550_spi_pio_txrxb()
520 hw->len = t->len; in au1550_spi_pio_txrxb()
521 hw->tx_count = 0; in au1550_spi_pio_txrxb()
522 hw->rx_count = 0; in au1550_spi_pio_txrxb()
528 while (hw->tx_count < hw->len) { in au1550_spi_pio_txrxb()
530 hw->tx_word(hw); in au1550_spi_pio_txrxb()
532 if (hw->tx_count >= hw->len) { in au1550_spi_pio_txrxb()
537 stat = hw->regs->psc_spistat; in au1550_spi_pio_txrxb()
544 hw->regs->psc_spimsk = mask; in au1550_spi_pio_txrxb()
548 hw->regs->psc_spipcr = PSC_SPIPCR_MS; in au1550_spi_pio_txrxb()
551 wait_for_completion(&hw->master_done); in au1550_spi_pio_txrxb()
553 return hw->rx_count < hw->tx_count ? hw->rx_count : hw->tx_count; in au1550_spi_pio_txrxb()
556 static irqreturn_t au1550_spi_pio_irq_callback(struct au1550_spi *hw) in au1550_spi_pio_irq_callback() argument
561 stat = hw->regs->psc_spistat; in au1550_spi_pio_irq_callback()
562 evnt = hw->regs->psc_spievent; in au1550_spi_pio_irq_callback()
565 dev_err(hw->dev, "Unexpected IRQ!\n"); in au1550_spi_pio_irq_callback()
577 au1550_spi_mask_ack_all(hw); in au1550_spi_pio_irq_callback()
578 au1550_spi_reset_fifos(hw); in au1550_spi_pio_irq_callback()
579 dev_err(hw->dev, in au1550_spi_pio_irq_callback()
582 complete(&hw->master_done); in au1550_spi_pio_irq_callback()
592 stat = hw->regs->psc_spistat; in au1550_spi_pio_irq_callback()
604 if (!(stat & PSC_SPISTAT_RE) && hw->rx_count < hw->len) { in au1550_spi_pio_irq_callback()
605 hw->rx_word(hw); in au1550_spi_pio_irq_callback()
608 if (!(stat & PSC_SPISTAT_TF) && hw->tx_count < hw->len) in au1550_spi_pio_irq_callback()
609 hw->tx_word(hw); in au1550_spi_pio_irq_callback()
613 hw->regs->psc_spievent = PSC_SPIEVNT_RR | PSC_SPIEVNT_TR; in au1550_spi_pio_irq_callback()
632 hw->regs->psc_spievent = PSC_SPIEVNT_TU | PSC_SPIEVNT_MD; in au1550_spi_pio_irq_callback()
634 hw->regs->psc_spipcr = PSC_SPIPCR_MS; in au1550_spi_pio_irq_callback()
638 if (hw->rx_count >= hw->len) { in au1550_spi_pio_irq_callback()
640 au1550_spi_mask_ack_all(hw); in au1550_spi_pio_irq_callback()
641 complete(&hw->master_done); in au1550_spi_pio_irq_callback()
648 struct au1550_spi *hw = spi_master_get_devdata(spi->master); in au1550_spi_txrx_bufs() local
649 return hw->txrx_bufs(spi, t); in au1550_spi_txrx_bufs()
654 struct au1550_spi *hw = dev; in au1550_spi_irq() local
655 return hw->irq_callback(hw); in au1550_spi_irq()
658 static void au1550_spi_bits_handlers_set(struct au1550_spi *hw, int bpw) in au1550_spi_bits_handlers_set() argument
661 if (hw->usedma) { in au1550_spi_bits_handlers_set()
662 hw->txrx_bufs = &au1550_spi_dma_txrxb; in au1550_spi_bits_handlers_set()
663 hw->irq_callback = &au1550_spi_dma_irq_callback; in au1550_spi_bits_handlers_set()
665 hw->rx_word = &au1550_spi_rx_word_8; in au1550_spi_bits_handlers_set()
666 hw->tx_word = &au1550_spi_tx_word_8; in au1550_spi_bits_handlers_set()
667 hw->txrx_bufs = &au1550_spi_pio_txrxb; in au1550_spi_bits_handlers_set()
668 hw->irq_callback = &au1550_spi_pio_irq_callback; in au1550_spi_bits_handlers_set()
671 hw->rx_word = &au1550_spi_rx_word_16; in au1550_spi_bits_handlers_set()
672 hw->tx_word = &au1550_spi_tx_word_16; in au1550_spi_bits_handlers_set()
673 hw->txrx_bufs = &au1550_spi_pio_txrxb; in au1550_spi_bits_handlers_set()
674 hw->irq_callback = &au1550_spi_pio_irq_callback; in au1550_spi_bits_handlers_set()
676 hw->rx_word = &au1550_spi_rx_word_32; in au1550_spi_bits_handlers_set()
677 hw->tx_word = &au1550_spi_tx_word_32; in au1550_spi_bits_handlers_set()
678 hw->txrx_bufs = &au1550_spi_pio_txrxb; in au1550_spi_bits_handlers_set()
679 hw->irq_callback = &au1550_spi_pio_irq_callback; in au1550_spi_bits_handlers_set()
683 static void au1550_spi_setup_psc_as_spi(struct au1550_spi *hw) in au1550_spi_setup_psc_as_spi() argument
688 hw->regs->psc_ctrl = PSC_CTRL_DISABLE; in au1550_spi_setup_psc_as_spi()
690 hw->regs->psc_sel = PSC_SEL_PS_SPIMODE; in au1550_spi_setup_psc_as_spi()
693 hw->regs->psc_spicfg = 0; in au1550_spi_setup_psc_as_spi()
696 hw->regs->psc_ctrl = PSC_CTRL_ENABLE; in au1550_spi_setup_psc_as_spi()
700 stat = hw->regs->psc_spistat; in au1550_spi_setup_psc_as_spi()
705 cfg = hw->usedma ? 0 : PSC_SPICFG_DD_DISABLE; in au1550_spi_setup_psc_as_spi()
715 hw->regs->psc_spicfg = cfg; in au1550_spi_setup_psc_as_spi()
718 au1550_spi_mask_ack_all(hw); in au1550_spi_setup_psc_as_spi()
720 hw->regs->psc_spicfg |= PSC_SPICFG_DE_ENABLE; in au1550_spi_setup_psc_as_spi()
724 stat = hw->regs->psc_spistat; in au1550_spi_setup_psc_as_spi()
728 au1550_spi_reset_fifos(hw); in au1550_spi_setup_psc_as_spi()
734 struct au1550_spi *hw; in au1550_spi_probe() local
750 hw = spi_master_get_devdata(master); in au1550_spi_probe()
752 hw->master = master; in au1550_spi_probe()
753 hw->pdata = dev_get_platdata(&pdev->dev); in au1550_spi_probe()
754 hw->dev = &pdev->dev; in au1550_spi_probe()
756 if (hw->pdata == NULL) { in au1550_spi_probe()
768 hw->irq = r->start; in au1550_spi_probe()
770 hw->usedma = 0; in au1550_spi_probe()
773 hw->dma_tx_id = r->start; in au1550_spi_probe()
776 hw->dma_rx_id = r->start; in au1550_spi_probe()
781 hw->usedma = 1; in au1550_spi_probe()
793 hw->ioarea = request_mem_region(r->start, sizeof(psc_spi_t), in au1550_spi_probe()
795 if (!hw->ioarea) { in au1550_spi_probe()
801 hw->regs = (psc_spi_t __iomem *)ioremap(r->start, sizeof(psc_spi_t)); in au1550_spi_probe()
802 if (!hw->regs) { in au1550_spi_probe()
808 platform_set_drvdata(pdev, hw); in au1550_spi_probe()
810 init_completion(&hw->master_done); in au1550_spi_probe()
812 hw->bitbang.master = hw->master; in au1550_spi_probe()
813 hw->bitbang.setup_transfer = au1550_spi_setupxfer; in au1550_spi_probe()
814 hw->bitbang.chipselect = au1550_spi_chipsel; in au1550_spi_probe()
815 hw->bitbang.txrx_bufs = au1550_spi_txrx_bufs; in au1550_spi_probe()
817 if (hw->usedma) { in au1550_spi_probe()
818 hw->dma_tx_ch = au1xxx_dbdma_chan_alloc(ddma_memid, in au1550_spi_probe()
819 hw->dma_tx_id, NULL, (void *)hw); in au1550_spi_probe()
820 if (hw->dma_tx_ch == 0) { in au1550_spi_probe()
826 au1xxx_dbdma_set_devwidth(hw->dma_tx_ch, 8); in au1550_spi_probe()
827 if (au1xxx_dbdma_ring_alloc(hw->dma_tx_ch, in au1550_spi_probe()
836 hw->dma_rx_ch = au1xxx_dbdma_chan_alloc(hw->dma_rx_id, in au1550_spi_probe()
837 ddma_memid, NULL, (void *)hw); in au1550_spi_probe()
838 if (hw->dma_rx_ch == 0) { in au1550_spi_probe()
844 au1xxx_dbdma_set_devwidth(hw->dma_rx_ch, 8); in au1550_spi_probe()
845 if (au1xxx_dbdma_ring_alloc(hw->dma_rx_ch, in au1550_spi_probe()
853 err = au1550_spi_dma_rxtmp_alloc(hw, in au1550_spi_probe()
862 au1550_spi_bits_handlers_set(hw, 8); in au1550_spi_probe()
864 err = request_irq(hw->irq, au1550_spi_irq, 0, pdev->name, hw); in au1550_spi_probe()
871 master->num_chipselect = hw->pdata->num_chipselect; in au1550_spi_probe()
885 master->max_speed_hz = hw->pdata->mainclk_hz / min_div; in au1550_spi_probe()
887 hw->pdata->mainclk_hz / (max_div + 1) + 1; in au1550_spi_probe()
890 au1550_spi_setup_psc_as_spi(hw); in au1550_spi_probe()
892 err = spi_bitbang_start(&hw->bitbang); in au1550_spi_probe()
905 free_irq(hw->irq, hw); in au1550_spi_probe()
908 au1550_spi_dma_rxtmp_free(hw); in au1550_spi_probe()
912 if (hw->usedma) in au1550_spi_probe()
913 au1xxx_dbdma_chan_free(hw->dma_rx_ch); in au1550_spi_probe()
917 if (hw->usedma) in au1550_spi_probe()
918 au1xxx_dbdma_chan_free(hw->dma_tx_ch); in au1550_spi_probe()
921 iounmap((void __iomem *)hw->regs); in au1550_spi_probe()
928 spi_master_put(hw->master); in au1550_spi_probe()
936 struct au1550_spi *hw = platform_get_drvdata(pdev); in au1550_spi_remove() local
939 hw->master->bus_num); in au1550_spi_remove()
941 spi_bitbang_stop(&hw->bitbang); in au1550_spi_remove()
942 free_irq(hw->irq, hw); in au1550_spi_remove()
943 iounmap((void __iomem *)hw->regs); in au1550_spi_remove()
944 release_mem_region(hw->ioarea->start, sizeof(psc_spi_t)); in au1550_spi_remove()
946 if (hw->usedma) { in au1550_spi_remove()
947 au1550_spi_dma_rxtmp_free(hw); in au1550_spi_remove()
948 au1xxx_dbdma_chan_free(hw->dma_rx_ch); in au1550_spi_remove()
949 au1xxx_dbdma_chan_free(hw->dma_tx_ch); in au1550_spi_remove()
952 spi_master_put(hw->master); in au1550_spi_remove()