static int audio_release(struct inode *inode, struct file *file) { audio_state_t *state = file->private_data; audio_stream_t *os = state->output_stream; audio_stream_t *is = state->input_stream; DPRINTK("audio_release\n"); down(&state->sem); if (file->f_mode & FMODE_READ) { audio_discard_buf(is); s3c2410_dma_free(is->dma,&s3c_rec_dma_client); state->rd_ref = 0; } if (file->f_mode & FMODE_WRITE) { audio_sync(file); audio_discard_buf(os); s3c2410_dma_free(os->dma,&s3c_play_dma_client); state->wr_ref = 0; } if (!AUDIO_ACTIVE(state)) { if (state->hw_shutdown) state->hw_shutdown(state->data); } up(&state->sem); return 0; }
void audio_ldm_suspend(void *data) { audio_state_t *state = data; audio_stream_t *is = state->input_stream; audio_stream_t *os = state->output_stream; int stopstate; if (is && is->dma_regs) { stopstate = is->stopped; audio_stop_dma(is); DMA_CLEAR(is); is->dma_spinref = 0; is->stopped = stopstate; } if (os && os->dma_regs) { stopstate = os->stopped; audio_stop_dma(os); DMA_CLEAR(os); os->dma_spinref = 0; os->stopped = stopstate; } if (AUDIO_ACTIVE(state) && state->hw_shutdown) state->hw_shutdown(state->data); }
static int audio_pm_callback(struct pm_dev *pm_dev, pm_request_t req, void *data) { audio_state_t *state = pm_dev->data; audio_stream_t *is = state->input_stream; audio_stream_t *os = state->output_stream; int stopstate; switch (req) { case PM_SUSPEND: /* enter D1-D3 */ if (is && is->dma_regs) { stopstate = is->stopped; audio_stop_dma(is); DMA_CLEAR(is); is->dma_spinref = 0; is->stopped = stopstate; } if (os && os->dma_regs) { stopstate = os->stopped; audio_stop_dma(os); DMA_CLEAR(os); os->dma_spinref = 0; os->stopped = stopstate; } if (AUDIO_ACTIVE(state) && state->hw_shutdown) state->hw_shutdown(state->data); break; case PM_RESUME: /* enter D0 */ if (AUDIO_ACTIVE(state) && state->hw_init) state->hw_init(state->data); if (os && os->dma_regs) { DMA_RESET(os); audio_process_dma(os); } if (is && is->dma_regs) { DMA_RESET(is); audio_process_dma(is); } break; } return 0; }
static int audio_pm_callback(struct pm_dev *pm_dev, pm_request_t req, void *data) { audio_state_t *state = (audio_state_t *)pm_dev->data; switch (req) { case PM_SUSPEND: /* enter D1-D3 */ if (state->output_stream) sa1100_dma_sleep(state->output_stream->dma_ch); if (state->input_stream) sa1100_dma_sleep(state->input_stream->dma_ch); if (AUDIO_ACTIVE(state) && state->hw_shutdown) state->hw_shutdown(state->data); break; case PM_RESUME: /* enter D0 */ if (AUDIO_ACTIVE(state) && state->hw_init) state->hw_init(state->data); if (state->input_stream) sa1100_dma_wakeup(state->input_stream->dma_ch); if (state->output_stream) sa1100_dma_wakeup(state->output_stream->dma_ch); break; } return 0; }
static int audio_release(struct inode *inode, struct file *file) { audio_state_t *state = file->private_data; audio_stream_t *os = state->output_stream; audio_stream_t *is = state->input_stream; DPRINTK("audio_release\n"); down(&state->sem); if (file->f_mode & FMODE_READ) { audio_discard_buf(is); DMA_FREE(is); is->dma_spinref = 0; if (state->need_tx_for_rx) { os->spin_idle = 0; if (!state->wr_ref) { DMA_FREE(os); os->dma_spinref = 0; } } state->rd_ref = 0; } if (file->f_mode & FMODE_WRITE) { audio_sync(file); audio_discard_buf(os); if (!state->need_tx_for_rx || !state->rd_ref) { DMA_FREE(os); os->dma_spinref = 0; } state->wr_ref = 0; } if (!AUDIO_ACTIVE(state)) { if (state->hw_shutdown) state->hw_shutdown(state->data); #ifdef CONFIG_PM pm_unregister(state->pm_dev); #endif } up(&state->sem); return 0; }
int s3c_audio_resume(audio_state_t *s, u32 level) { if (level == RESUME_ENABLE) { #if 0 audio_stream_t *is = s->input_stream; audio_stream_t *os = s->output_stream; if (AUDIO_ACTIVE(s) && s->hw_init) s->hw_init(s->data); if (os && os->dma_regs) { //DMA_RESET(os); audio_process_dma(os); } if (is && is->dma_regs) { //DMA_RESET(is); audio_process_dma(is); } #endif } return 0; }
static int audio_release(struct inode *inode, struct file *file) { audio_state_t *state = (audio_state_t *)file->private_data; DPRINTK("audio_release\n"); down(&state->sem); if (file->f_mode & FMODE_READ) { if (state->tx_spinning) { sa1100_dma_set_spin(state->output_stream->dma_ch, 0, 0); state->tx_spinning = 0; } audio_clear_buf(state->input_stream); if (!state->skip_dma_init) { sa1100_free_dma(state->input_stream->dma_ch); if (state->need_tx_for_rx && !state->wr_ref) sa1100_free_dma(state->output_stream->dma_ch); } state->rd_ref = 0; } if (file->f_mode & FMODE_WRITE) { audio_sync(file); audio_clear_buf(state->output_stream); if (!state->skip_dma_init) if (!state->need_tx_for_rx || !state->rd_ref) sa1100_free_dma(state->output_stream->dma_ch); state->wr_ref = 0; } if (!AUDIO_ACTIVE(state)) { if (state->hw_shutdown) state->hw_shutdown(state->data); #ifdef CONFIG_PM pm_unregister(state->pm_dev); #endif } up(&state->sem); return 0; }
void audio_ldm_resume(void *data) { audio_state_t *state = data; audio_stream_t *is = state->input_stream; audio_stream_t *os = state->output_stream; if (AUDIO_ACTIVE(state) && state->hw_init) state->hw_init(state->data); if (os && os->dma_regs) { DMA_RESET(os); audio_reset(os); wake_up(&os->wq); } if (is && is->dma_regs) { DMA_RESET(is); audio_reset(is); wake_up(&is->wq); } }
int s3c_audio_suspend(audio_state_t *s, u32 state, u32 level) { if (level == SUSPEND_DISABLE || level == SUSPEND_POWER_DOWN) { audio_stream_t *is = s->input_stream; audio_stream_t *os = s->output_stream; int stopstate; if (is ) { stopstate = is->stopped; audio_stop_dma(is); s3c2410_dma_ctrl(is->dma, S3C2410_DMAOP_FLUSH); is->stopped = stopstate; } if (os ) { stopstate = os->stopped; audio_stop_dma(os); s3c2410_dma_ctrl(os->dma, S3C2410_DMAOP_FLUSH); os->stopped = stopstate; } if (AUDIO_ACTIVE(s) && s->hw_shutdown) s->hw_shutdown(s->data); } return 0; }
int omap_audio_attach(struct inode *inode, struct file *file, audio_state_t *state) { audio_stream_t *os = state->output_stream; audio_stream_t *is = state->input_stream; int err, need_tx_dma; DPRINTK("audio_open\n"); down(&state->sem); /* access control */ err = -ENODEV; if ((file->f_mode & FMODE_WRITE) && !os) goto out; if ((file->f_mode & FMODE_READ) && !is) goto out; err = -EBUSY; if ((file->f_mode & FMODE_WRITE) && state->wr_ref) goto out; if ((file->f_mode & FMODE_READ) && state->rd_ref) goto out; err = -EINVAL; if ((file->f_mode & FMODE_READ) && state->need_tx_for_rx && !os) goto out; /* request DMA channels */ need_tx_dma = ((file->f_mode & FMODE_WRITE) || ((file->f_mode & FMODE_READ) && state->need_tx_for_rx)); if (state->wr_ref || (state->rd_ref && state->need_tx_for_rx)) need_tx_dma = 0; if (need_tx_dma) { err = DMA_REQUEST(os, audio_dma_callback); if (err) goto out; } if (file->f_mode & FMODE_READ) { err = DMA_REQUEST(is, audio_dma_callback); if (err) { if (need_tx_dma) DMA_FREE(os); goto out; } } /* now complete initialisation */ if (!AUDIO_ACTIVE(state)) { if (state->hw_init) state->hw_init(state->data); #ifdef CONFIG_PM state->pm_dev = pm_register(PM_SYS_DEV, 0, audio_pm_callback); if (state->pm_dev) state->pm_dev->data = state; #endif } if ((file->f_mode & FMODE_WRITE)) { state->wr_ref = 1; audio_reset(os); os->fragsize = AUDIO_FRAGSIZE_DEFAULT; os->nbfrags = AUDIO_NBFRAGS_DEFAULT; os->mapped = 0; init_waitqueue_head(&os->wq); } if (file->f_mode & FMODE_READ) { state->rd_ref = 1; audio_reset(is); is->fragsize = AUDIO_FRAGSIZE_DEFAULT; is->nbfrags = AUDIO_NBFRAGS_DEFAULT; is->mapped = 0; init_waitqueue_head(&is->wq); } file->private_data = state; file->f_op->release = audio_release; file->f_op->write = audio_write; file->f_op->read = audio_read; file->f_op->mmap = audio_mmap; file->f_op->poll = audio_poll; file->f_op->ioctl = audio_ioctl; file->f_op->llseek = audio_llseek; err = 0; out: up(&state->sem); return err; }
int s3c_audio_attach(struct inode *inode, struct file *file, audio_state_t *state) { audio_stream_t *os = state->output_stream; audio_stream_t *is = state->input_stream; int err, need_tx_dma=0; down(&state->sem); /* access control */ err = -ENODEV; if ((file->f_mode & FMODE_WRITE) && !os) goto out; if ((file->f_mode & FMODE_READ) && !is) goto out; err = -EBUSY; if ((file->f_mode & FMODE_WRITE) && state->wr_ref) goto out; if ((file->f_mode & FMODE_READ) && state->rd_ref) goto out; err = -EINVAL; if ((file->f_mode & FMODE_READ) && state->need_tx_for_rx && !os) goto out; if(file->f_mode & FMODE_READ) file->f_mode = FMODE_READ; /* request DMA channels */ if (file->f_mode & FMODE_WRITE) { if(s3c2410_dma_request(os->dma, &s3c_play_dma_client, NULL)) { printk(KERN_WARNING "unable to get DMA channel.\n" ); err = -EBUSY; goto out; } err = s3c_iis_dma_init(os,0); } if (file->f_mode & FMODE_READ) { if(s3c2410_dma_request(is->dma, &s3c_rec_dma_client, NULL)) { printk(KERN_WARNING "unable to get DMA channel.\n" ); err = -EBUSY; if (need_tx_dma) s3c2410_dma_free(is->dma,&s3c_play_dma_client); goto out; } err = s3c_iis_dma_init(is,1); } /* now complete initialisation */ if (!AUDIO_ACTIVE(state)) { if (state->hw_init) state->hw_init(state->data); } if ((file->f_mode & FMODE_WRITE)) { state->wr_ref = 1; audio_reset(os); os->fragsize = AUDIO_FRAGSIZE_DEFAULT; os->nbfrags = AUDIO_NBFRAGS_DEFAULT; os->mapped = 0; init_waitqueue_head(&os->wq); } if (file->f_mode & FMODE_READ) { state->rd_ref = 1; audio_reset(is); is->fragsize = AUDIO_FRAGSIZE_DEFAULT; is->nbfrags = AUDIO_NBFRAGS_DEFAULT; is->mapped = 0; init_waitqueue_head(&is->wq); } file->private_data = state; file->f_op = &s3c_f_ops; err = 0; out: up(&state->sem); return err; }
int sa1100_audio_attach(struct inode *inode, struct file *file, audio_state_t *state) { int err, need_tx_dma; DPRINTK("audio_open\n"); down(&state->sem); /* access control */ err = -ENODEV; if ((file->f_mode & FMODE_WRITE) && !state->output_stream) goto out; if ((file->f_mode & FMODE_READ) && !state->input_stream) goto out; err = -EBUSY; if ((file->f_mode & FMODE_WRITE) && state->wr_ref) goto out; if ((file->f_mode & FMODE_READ) && state->rd_ref) goto out; err = -EINVAL; if ((file->f_mode & FMODE_READ) && state->need_tx_for_rx && !state->output_stream) goto out; /* request DMA channels */ if (state->skip_dma_init) goto skip_dma; need_tx_dma = ((file->f_mode & FMODE_WRITE) || ((file->f_mode & FMODE_READ) && state->need_tx_for_rx)); if (state->wr_ref || (state->rd_ref && state->need_tx_for_rx)) need_tx_dma = 0; if (need_tx_dma) { err = sa1100_request_dma(&state->output_stream->dma_ch, state->output_id, state->output_dma); if (err) goto out; } if (file->f_mode & FMODE_READ) { err = sa1100_request_dma(&state->input_stream->dma_ch, state->input_id, state->input_dma); if (err) { if (need_tx_dma) sa1100_free_dma(state->output_stream->dma_ch); goto out; } } skip_dma: /* now complete initialisation */ if (!AUDIO_ACTIVE(state)) { if (state->hw_init) state->hw_init(state->data); #ifdef CONFIG_PM state->pm_dev = pm_register(PM_SYS_DEV, 0, audio_pm_callback); if (state->pm_dev) state->pm_dev->data = state; #endif } if ((file->f_mode & FMODE_WRITE)) { state->wr_ref = 1; audio_clear_buf(state->output_stream); state->output_stream->fragsize = AUDIO_FRAGSIZE_DEFAULT; state->output_stream->nbfrags = AUDIO_NBFRAGS_DEFAULT; state->output_stream->mapped = 0; sa1100_dma_set_callback(state->output_stream->dma_ch, audio_dmaout_done_callback); init_waitqueue_head(&state->output_stream->wq); } if (file->f_mode & FMODE_READ) { state->rd_ref = 1; audio_clear_buf(state->input_stream); state->input_stream->fragsize = AUDIO_FRAGSIZE_DEFAULT; state->input_stream->nbfrags = AUDIO_NBFRAGS_DEFAULT; state->input_stream->mapped = 0; sa1100_dma_set_callback(state->input_stream->dma_ch, audio_dmain_done_callback); init_waitqueue_head(&state->input_stream->wq); } file->private_data = state; file->f_op->release = audio_release; file->f_op->write = audio_write; file->f_op->read = audio_read; file->f_op->mmap = audio_mmap; file->f_op->poll = audio_poll; file->f_op->ioctl = audio_ioctl; file->f_op->llseek = audio_llseek; err = 0; out: up(&state->sem); return err; }