/** * BAM DMA device enable * * This function initializes a BAM DMA device. * * @dev - pointer to BAM DMA device context * * @return 0 on success, negative value on error * */ static int sps_dma_device_disable(struct bamdma_device *dev) { u32 pipe_index; if (!dev->enabled) return 0; /* Do not disable if channels active */ for (pipe_index = 0; pipe_index < dev->num_pipes; pipe_index++) { if (dev->pipes[pipe_index] != PIPE_INACTIVE) break; } if (pipe_index < dev->num_pipes) { SPS_ERR("Failed to disable BAM-DMA %x: channels are active", dev->phys_addr); return SPS_ERROR; } dev->enabled = false; /* Disable BAM device */ if (sps_bam_disable(dev->bam)) { SPS_ERR("Failed to disable BAM-DMA %x BAM", dev->phys_addr); return SPS_ERROR; } /* Is the BAM-DMA device locally controlled? */ if (dev->local) /* Disable BAM-DMA device */ dma_write_reg(dev->virt_addr, DMA_ENBL, 0); return 0; }
static int sps_dma_device_disable(struct bamdma_device *dev) { u32 pipe_index; if (!dev->enabled) return 0; for (pipe_index = 0; pipe_index < dev->num_pipes; pipe_index++) { if (dev->pipes[pipe_index] != PIPE_INACTIVE) break; } if (pipe_index < dev->num_pipes) { SPS_ERR("sps:Fail to disable BAM-DMA %x:channels are active", dev->phys_addr); return SPS_ERROR; } dev->enabled = false; if (sps_bam_disable(dev->bam)) { SPS_ERR("sps:Fail to disable BAM-DMA BAM:%x", dev->phys_addr); return SPS_ERROR; } if (dev->local) dma_write_reg(dev->virt_addr, DMA_ENBL, 0); return 0; }