static int tegra_spi_dma_finish(struct tegra_spi_channel *spi) { int ret; unsigned int todo; struct apb_dma * const apb_dma = (struct apb_dma *)TEGRA_APB_DMA_BASE; todo = read32(&spi->dma_in->regs->wcount); if (spi->dma_in) { while ((read32(&spi->dma_in->regs->dma_byte_sta) < todo) || dma_busy(spi->dma_in)) ; dma_stop(spi->dma_in); clrbits_le32(&spi->regs->command1, SPI_CMD1_RX_EN); /* Disable secure access for the channel. */ clrbits_le32(&apb_dma->security_reg, SECURITY_EN_BIT(spi->dma_in->num)); dma_release(spi->dma_in); } if (spi->dma_out) { while ((read32(&spi->dma_out->regs->dma_byte_sta) < todo) || dma_busy(spi->dma_out)) ; clrbits_le32(&spi->regs->command1, SPI_CMD1_TX_EN); dma_stop(spi->dma_out); /* Disable secure access for the channel. */ clrbits_le32(&apb_dma->security_reg, SECURITY_EN_BIT(spi->dma_out->num)); dma_release(spi->dma_out); } if (fifo_error(spi)) { printk(BIOS_ERR, "%s: ERROR:\n", __func__); dump_dma_regs(spi->dma_out); dump_dma_regs(spi->dma_in); dump_spi_regs(spi); dump_fifo_status(spi); ret = -1; goto done; } ret = 0; done: spi->dma_in = NULL; spi->dma_out = NULL; return ret; }
static int tegra_spi_dma_finish(struct tegra_spi_channel *spi) { int ret; unsigned int todo; todo = read32(&spi->dma_in->regs->wcount); if (spi->dma_in) { while ((read32(&spi->dma_in->regs->dma_byte_sta) < todo) || dma_busy(spi->dma_in)) ; /* this shouldn't take long, no udelay */ dma_stop(spi->dma_in); clrbits_le32(&spi->regs->command1, SPI_CMD1_RX_EN); dma_release(spi->dma_in); } if (spi->dma_out) { while ((read32(&spi->dma_out->regs->dma_byte_sta) < todo) || dma_busy(spi->dma_out)) spi_delay(spi, todo - spi_byte_count(spi)); clrbits_le32(&spi->regs->command1, SPI_CMD1_TX_EN); dma_stop(spi->dma_out); dma_release(spi->dma_out); } if (fifo_error(spi)) { printk(BIOS_ERR, "%s: ERROR:\n", __func__); dump_dma_regs(spi->dma_out); dump_dma_regs(spi->dma_in); dump_spi_regs(spi); dump_fifo_status(spi); ret = -1; goto done; } ret = 0; done: spi->dma_in = NULL; spi->dma_out = NULL; return ret; }
void __init init_one_dvma(struct sbus_dma *dma, int num_dma) { printk("dma%d: ", num_dma); dma->next = 0; dma->running = 0; /* No transfers going on as of yet */ dma->allocated = 0; /* No one has allocated us yet */ switch(sbus_readl(dma->regs + DMA_CSR)&DMA_DEVICE_ID) { case DMA_VERS0: dma->revision = dvmarev0; printk("Revision 0 "); break; case DMA_ESCV1: dma->revision = dvmaesc1; printk("ESC Revision 1 "); break; case DMA_VERS1: dma->revision = dvmarev1; printk("Revision 1 "); break; case DMA_VERS2: dma->revision = dvmarev2; printk("Revision 2 "); break; case DMA_VERHME: dma->revision = dvmahme; printk("HME DVMA gate array "); break; case DMA_VERSPLUS: dma->revision = dvmarevplus; printk("Revision 1 PLUS "); break; default: printk("unknown dma version %08x", sbus_readl(dma->regs + DMA_CSR) & DMA_DEVICE_ID); dma->allocated = 1; break; } printk("\n"); #if 0 /* Clutters up the screen */ dump_dma_regs(dma->regs); #endif }