diff options
-rw-r--r-- | drivers/mxc/asrc/mxc_asrc.c | 30 | ||||
-rw-r--r-- | include/linux/mxc_asrc.h | 2 |
2 files changed, 22 insertions, 10 deletions
diff --git a/drivers/mxc/asrc/mxc_asrc.c b/drivers/mxc/asrc/mxc_asrc.c index 41e3f707dfcd..b4ec41ad90da 100644 --- a/drivers/mxc/asrc/mxc_asrc.c +++ b/drivers/mxc/asrc/mxc_asrc.c @@ -341,6 +341,11 @@ int asrc_req_pair(int chn_num, enum asrc_pair_index *index) } } spin_unlock_irqrestore(&data_lock, lock_flags); + + if (!err) { + clk_enable(g_asrc->mxc_asrc_data->asrc_core_clk); + clk_enable(g_asrc->mxc_asrc_data->asrc_audio_clk); + } return err; } @@ -595,10 +600,7 @@ void asrc_start_conv(enum asrc_pair_index index) int i; spin_lock_irqsave(&data_lock, lock_flags); - reg = __raw_readl(g_asrc->vaddr + ASRC_ASRCTR_REG); - if ((reg & 0x0E) == 0) - clk_enable(g_asrc->mxc_asrc_data->asrc_audio_clk); reg |= (1 << (1 + index)); __raw_writel(reg, g_asrc->vaddr + ASRC_ASRCTR_REG); @@ -650,14 +652,22 @@ void asrc_stop_conv(enum asrc_pair_index index) reg = __raw_readl(g_asrc->vaddr + ASRC_ASRCTR_REG); reg &= ~(1 << (1 + index)); __raw_writel(reg, g_asrc->vaddr + ASRC_ASRCTR_REG); - if ((reg & 0x0E) == 0) - clk_disable(g_asrc->mxc_asrc_data->asrc_audio_clk); spin_unlock_irqrestore(&data_lock, lock_flags); + return; } EXPORT_SYMBOL(asrc_stop_conv); +void asrc_finish_conv(enum asrc_pair_index index) +{ + clk_disable(g_asrc->mxc_asrc_data->asrc_audio_clk); + clk_disable(g_asrc->mxc_asrc_data->asrc_core_clk); + + return; +} +EXPORT_SYMBOL(asrc_finish_conv); + int asrc_get_dma_request(enum asrc_pair_index index, bool in) { if (in) @@ -665,6 +675,7 @@ int asrc_get_dma_request(enum asrc_pair_index index, bool in) else return g_asrc->dmatx[index]; } + EXPORT_SYMBOL(asrc_get_dma_request); /*! @@ -753,6 +764,7 @@ u32 asrc_get_per_addr(enum asrc_pair_index index, bool in) else return g_asrc->paddr + ASRC_ASRDOA_REG + (index << 3); } + EXPORT_SYMBOL(asrc_get_per_addr); static int mxc_init_asrc(void) @@ -1132,6 +1144,7 @@ static long asrc_ioctl(struct file *file, mxc_free_dma_buf(params); asrc_release_pair(index); + asrc_finish_conv(index); params->pair_hold = 0; break; } @@ -1430,7 +1443,6 @@ static int mxc_asrc_open(struct inode *inode, struct file *file) int err = 0; struct asrc_pair_params *pair_params; - clk_enable(g_asrc->mxc_asrc_data->asrc_core_clk); if (signal_pending(current)) return -EINTR; pair_params = kzalloc(sizeof(struct asrc_pair_params), GFP_KERNEL); @@ -1438,7 +1450,6 @@ static int mxc_asrc_open(struct inode *inode, struct file *file) pr_debug("Failed to allocate pair_params\n"); err = -ENOBUFS; } - clk_enable(g_asrc->mxc_asrc_data->asrc_core_clk); file->private_data = pair_params; return err; } @@ -1474,10 +1485,10 @@ static int mxc_asrc_close(struct inode *inode, struct file *file) pair_params->output_dma_channel); mxc_free_dma_buf(pair_params); asrc_release_pair(pair_params->index); + asrc_finish_conv(pair_params->index); } kfree(pair_params); file->private_data = NULL; - clk_disable(g_asrc->mxc_asrc_data->asrc_core_clk); } return 0; } @@ -1712,11 +1723,9 @@ static int mxc_asrc_probe(struct platform_device *pdev) if (err < 0) goto err_out_class; - clk_disable(g_asrc->mxc_asrc_data->asrc_core_clk); goto out; err_out_class: - clk_disable(g_asrc->mxc_asrc_data->asrc_core_clk); device_destroy(g_asrc->asrc_class, MKDEV(g_asrc->asrc_major, 0)); class_destroy(g_asrc->asrc_class); err_out_chrdev: @@ -1724,6 +1733,7 @@ static int mxc_asrc_probe(struct platform_device *pdev) error: kfree(g_asrc); out: + clk_disable(g_asrc->mxc_asrc_data->asrc_core_clk); pr_info("mxc_asrc registered\n"); return err; } diff --git a/include/linux/mxc_asrc.h b/include/linux/mxc_asrc.h index c5b1d3e312ba..6de6a7e3cd86 100644 --- a/include/linux/mxc_asrc.h +++ b/include/linux/mxc_asrc.h @@ -230,6 +230,8 @@ extern void asrc_start_conv(enum asrc_pair_index index); extern void asrc_stop_conv(enum asrc_pair_index index); extern u32 asrc_get_per_addr(enum asrc_pair_index index, bool i); extern int asrc_get_dma_request(enum asrc_pair_index index, bool i); +extern void asrc_finish_conv(enum asrc_pair_index index); + #endif /* __kERNEL__ */ #endif /* __MXC_ASRC_H__ */ |