static int omap_pcm_trigger(struct snd_pcm_substream *substream, int cmd) { struct snd_pcm_runtime *runtime = substream->runtime; struct omap_runtime_data *prtd = runtime->private_data; struct omap_pcm_dma_data *dma_data = prtd->dma_data; unsigned long flags; int ret = 0; spin_lock_irqsave(&prtd->lock, flags); switch (cmd) { case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: prtd->period_index = 0; /* Configure McBSP internal buffer usage */ if (dma_data->set_threshold) dma_data->set_threshold(substream); omap_start_dma(prtd->dma_ch); break; case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: prtd->period_index = -1; omap_stop_dma(prtd->dma_ch); #if 0 // orig /* Since we are using self linking, there is a chance that the DMA as re-enabled the channel just after disabling it */ while (omap_get_dma_active_status(prtd->dma_ch)) omap_stop_dma(prtd->dma_ch); #else // [email protected], TI patch error in the recording if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { /* Fix: Ensure that the DMA channel is stopped for self linked audio DMA channel */ while (omap_get_dma_active_status(prtd->dma_ch)) omap_stop_dma(prtd->dma_ch); } #endif break; default: ret = -EINVAL; } spin_unlock_irqrestore(&prtd->lock, flags); return ret; }
static void serial_omap_stop_tx(struct uart_port *port) { struct uart_omap_port *up = (struct uart_omap_port *)port; struct omap_uart_port_info *pdata = up->pdev->dev.platform_data; if (up->use_dma && up->uart_dma.tx_dma_channel != OMAP_UART_DMA_CH_FREE) { if (omap_get_dma_active_status(up->uart_dma.tx_dma_channel)) return; omap_stop_dma(up->uart_dma.tx_dma_channel); omap_free_dma(up->uart_dma.tx_dma_channel); up->uart_dma.tx_dma_channel = OMAP_UART_DMA_CH_FREE; pm_runtime_mark_last_busy(&up->pdev->dev); pm_runtime_put_autosuspend(&up->pdev->dev); } pm_runtime_get_sync(&up->pdev->dev); if (up->ier & UART_IER_THRI) { up->ier &= ~UART_IER_THRI; serial_out(up, UART_IER, up->ier); } if (!up->use_dma && pdata && pdata->set_forceidle) pdata->set_forceidle(up->pdev); pm_runtime_mark_last_busy(&up->pdev->dev); pm_runtime_put_autosuspend(&up->pdev->dev); }
static void serial_omap_stop_tx(struct uart_port *port) { struct uart_omap_port *up = (struct uart_omap_port *)port; if (up->use_dma && up->uart_dma.tx_dma_channel != OMAP_UART_DMA_CH_FREE) { /* * Check if dma is still active. If yes do nothing, * return. Else stop dma */ if (omap_get_dma_active_status(up->uart_dma.tx_dma_channel)) return; omap_stop_dma(up->uart_dma.tx_dma_channel); omap_free_dma(up->uart_dma.tx_dma_channel); up->uart_dma.tx_dma_channel = OMAP_UART_DMA_CH_FREE; serial_omap_port_disable(up); } serial_omap_port_enable(up); if (up->ier & UART_IER_THRI) { up->ier &= ~UART_IER_THRI; serial_out(up, UART_IER, up->ier); } serial_omap_port_disable(up); }
static void serial_omap_stop_tx(struct uart_port *port) { struct uart_omap_port *up = (struct uart_omap_port *)port; if (up->use_dma && up->uart_dma.tx_dma_channel != OMAP_UART_DMA_CH_FREE) { /* * Check if dma is still active. If yes do nothing, * return. Else stop dma */ if (omap_get_dma_active_status(up->uart_dma.tx_dma_channel)) return; omap_stop_dma(up->uart_dma.tx_dma_channel); omap_free_dma(up->uart_dma.tx_dma_channel); up->uart_dma.tx_dma_channel = OMAP_UART_DMA_CH_FREE; pm_runtime_mark_last_busy(&up->pdev->dev); pm_runtime_put_autosuspend(&up->pdev->dev); } pm_runtime_get_sync(&up->pdev->dev); if (up->ier & UART_IER_THRI) { up->ier &= ~UART_IER_THRI; serial_out(up, UART_IER, up->ier); } pm_runtime_mark_last_busy(&up->pdev->dev); pm_runtime_put_autosuspend(&up->pdev->dev); }
static void serial_omap_stop_tx(struct uart_port *port) { struct uart_omap_port *up = (struct uart_omap_port *)port; if (up->use_dma && up->uart_dma.tx_dma_channel != OMAP_UART_DMA_CH_FREE) { /* * Check if dma is still active. If yes do nothing, * return. Else stop dma */ if (omap_get_dma_active_status(up->uart_dma.tx_dma_channel)) return; omap_stop_dma(up->uart_dma.tx_dma_channel); omap_free_dma(up->uart_dma.tx_dma_channel); up->uart_dma.tx_dma_channel = OMAP_UART_DMA_CH_FREE; } if (!(up->rs485.flags & SER_RS485_ENABLED)) { serial_omap_disable_ier_thri(up); return; } up->tx_wait_end = 1; serial_omap_thri_mode(up); serial_omap_enable_ier_thri(up); }
static void abe_dbg_stop_dma(struct omap_abe *abe) { /* Since we are using self linking, there is a chance that the DMA as re-enabled the channel just after disabling it */ while (omap_get_dma_active_status(abe->debugfs.dma_ch)) omap_stop_dma(abe->debugfs.dma_ch); if (abe->debugfs.circular) omap_dma_unlink_lch(abe->debugfs.dma_ch, abe->debugfs.dma_ch); omap_free_dma(abe->debugfs.dma_ch); pm_runtime_put_sync(abe->dev); }
static int omap_pcm_trigger(struct snd_pcm_substream *substream, int cmd) { struct snd_pcm_runtime *runtime = substream->runtime; struct omap_runtime_data *prtd = runtime->private_data; struct omap_pcm_dma_data *dma_data = prtd->dma_data; unsigned long flags; int ret = 0; spin_lock_irqsave(&prtd->lock, flags); switch (cmd) { case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: prtd->period_index = 0; /* Configure McBSP internal buffer usage */ if (dma_data->set_threshold) dma_data->set_threshold(substream); omap_start_dma(prtd->dma_ch); break; case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: prtd->period_index = -1; omap_stop_dma(prtd->dma_ch); if (cpu_is_omap44xx()) { /* Since we are using self linking, there is a chance that the DMA as re-enabled the channel just after disabling it */ while (omap_get_dma_active_status(prtd->dma_ch)) omap_stop_dma(prtd->dma_ch); } break; default: ret = -EINVAL; } spin_unlock_irqrestore(&prtd->lock, flags); return ret; }