Lines Matching +full:codec +full:- +full:reset
1 // SPDX-License-Identifier: GPL-2.0-only
7 * Based on s3c-ac97 ASoC driver by Jaswinder Singh.
23 #include <linux/platform_data/dma-ep93xx.h>
26 #include "ep93xx-pcm.h"
29 * Per channel (1-4) registers.
31 #define AC97CH(n) (((n) - 1) * 0x20)
88 * struct ep93xx_ac97_info - EP93xx AC97 controller info structure
107 .name = "ac97-pcm-out",
113 .name = "ac97-pcm-in",
121 return __raw_readl(info->regs + reg); in ep93xx_ac97_read_reg()
127 __raw_writel(val, info->regs + reg); in ep93xx_ac97_write_reg()
136 mutex_lock(&info->lock); in ep93xx_ac97_read()
140 if (!wait_for_completion_timeout(&info->done, AC97_TIMEOUT)) { in ep93xx_ac97_read()
141 dev_warn(info->dev, "timeout reading register %x\n", reg); in ep93xx_ac97_read()
142 mutex_unlock(&info->lock); in ep93xx_ac97_read()
143 return -ETIMEDOUT; in ep93xx_ac97_read()
147 mutex_unlock(&info->lock); in ep93xx_ac97_read()
157 mutex_lock(&info->lock); in ep93xx_ac97_write()
160 * Writes to the codec need to be done so that slot 2 is filled in in ep93xx_ac97_write()
167 if (!wait_for_completion_timeout(&info->done, AC97_TIMEOUT)) in ep93xx_ac97_write()
168 dev_warn(info->dev, "timeout writing register %x\n", reg); in ep93xx_ac97_write()
170 mutex_unlock(&info->lock); in ep93xx_ac97_write()
177 mutex_lock(&info->lock); in ep93xx_ac97_warm_reset()
180 * We are assuming that before this functions gets called, the codec in ep93xx_ac97_warm_reset()
181 * BIT_CLK is stopped by forcing the codec into powerdown mode. We can in ep93xx_ac97_warm_reset()
187 if (!wait_for_completion_timeout(&info->done, AC97_TIMEOUT)) in ep93xx_ac97_warm_reset()
188 dev_warn(info->dev, "codec warm reset timeout\n"); in ep93xx_ac97_warm_reset()
190 mutex_unlock(&info->lock); in ep93xx_ac97_warm_reset()
197 mutex_lock(&info->lock); in ep93xx_ac97_cold_reset()
200 * For doing cold reset, we disable the AC97 controller interface, clear in ep93xx_ac97_cold_reset()
208 * Now, assert the reset and wait for the codec to become ready. in ep93xx_ac97_cold_reset()
212 if (!wait_for_completion_timeout(&info->done, AC97_TIMEOUT)) in ep93xx_ac97_cold_reset()
213 dev_warn(info->dev, "codec cold reset timeout\n"); in ep93xx_ac97_cold_reset()
216 * Give the codec some time to come fully out from the reset. This way in ep93xx_ac97_cold_reset()
221 mutex_unlock(&info->lock); in ep93xx_ac97_cold_reset()
239 complete(&info->done); in ep93xx_ac97_interrupt()
246 .reset = ep93xx_ac97_cold_reset,
260 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in ep93xx_ac97_trigger()
284 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in ep93xx_ac97_trigger()
298 dev_warn(info->dev, "TX timeout\n"); in ep93xx_ac97_trigger()
312 dev_warn(info->dev, "unknown command %d\n", cmd); in ep93xx_ac97_trigger()
313 return -EINVAL; in ep93xx_ac97_trigger()
323 info->dma_params_tx.filter_data = &ep93xx_ac97_pcm_out; in ep93xx_ac97_dai_probe()
324 info->dma_params_rx.filter_data = &ep93xx_ac97_pcm_in; in ep93xx_ac97_dai_probe()
326 dai->playback_dma_data = &info->dma_params_tx; in ep93xx_ac97_dai_probe()
327 dai->capture_dma_data = &info->dma_params_rx; in ep93xx_ac97_dai_probe()
337 .name = "ep93xx-ac97",
358 .name = "ep93xx-ac97",
367 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); in ep93xx_ac97_probe()
369 return -ENOMEM; in ep93xx_ac97_probe()
371 info->regs = devm_platform_ioremap_resource(pdev, 0); in ep93xx_ac97_probe()
372 if (IS_ERR(info->regs)) in ep93xx_ac97_probe()
373 return PTR_ERR(info->regs); in ep93xx_ac97_probe()
377 return irq < 0 ? irq : -ENODEV; in ep93xx_ac97_probe()
379 ret = devm_request_irq(&pdev->dev, irq, ep93xx_ac97_interrupt, in ep93xx_ac97_probe()
380 IRQF_TRIGGER_HIGH, pdev->name, info); in ep93xx_ac97_probe()
384 dev_set_drvdata(&pdev->dev, info); in ep93xx_ac97_probe()
386 mutex_init(&info->lock); in ep93xx_ac97_probe()
387 init_completion(&info->done); in ep93xx_ac97_probe()
388 info->dev = &pdev->dev; in ep93xx_ac97_probe()
397 ret = snd_soc_register_component(&pdev->dev, &ep93xx_ac97_component, in ep93xx_ac97_probe()
402 ret = devm_ep93xx_pcm_platform_register(&pdev->dev); in ep93xx_ac97_probe()
409 snd_soc_unregister_component(&pdev->dev); in ep93xx_ac97_probe()
420 snd_soc_unregister_component(&pdev->dev); in ep93xx_ac97_remove()
436 .name = "ep93xx-ac97",
445 MODULE_ALIAS("platform:ep93xx-ac97");