Lines Matching +full:i2s +full:- +full:regs

1 // SPDX-License-Identifier: GPL-2.0-only
3 * linux/sound/soc/ep93xx-i2s.c
4 * EP93xx I2S driver
26 #include <linux/platform_data/dma-ep93xx.h>
29 #include "ep93xx-pcm.h"
59 * 0 - Generate interrupt when FIFO is half empty
60 * 1 - Generate interrupt when FIFO is empty
77 void __iomem *regs; member
84 .name = "i2s-pcm-out",
89 .name = "i2s-pcm-in",
98 __raw_writel(val, info->regs + reg); in ep93xx_i2s_write_reg()
104 return __raw_readl(info->regs + reg); in ep93xx_i2s_read_reg()
114 clk_enable(info->mclk); in ep93xx_i2s_enable()
115 clk_enable(info->sclk); in ep93xx_i2s_enable()
116 clk_enable(info->lrclk); in ep93xx_i2s_enable()
118 /* Enable i2s */ in ep93xx_i2s_enable()
155 /* Disable i2s */ in ep93xx_i2s_disable()
159 clk_disable(info->lrclk); in ep93xx_i2s_disable()
160 clk_disable(info->sclk); in ep93xx_i2s_disable()
161 clk_disable(info->mclk); in ep93xx_i2s_disable()
166 * According to documentation I2S controller can handle underflow conditions
169 * FIFO, fills the buffer with zeroes and re-enables the FIFO. State machine
190 /* Re-enable FIFO */ in ep93xx_i2s_interrupt()
200 info->dma_params_tx.filter_data = in ep93xx_i2s_dai_probe()
202 info->dma_params_rx.filter_data = in ep93xx_i2s_dai_probe()
205 dai->playback_dma_data = &info->dma_params_tx; in ep93xx_i2s_dai_probe()
206 dai->capture_dma_data = &info->dma_params_rx; in ep93xx_i2s_dai_probe()
216 ep93xx_i2s_disable(info, substream->stream); in ep93xx_i2s_shutdown()
245 return -EINVAL; in ep93xx_i2s_set_dai_fmt()
260 return -EINVAL; in ep93xx_i2s_set_dai_fmt()
317 return -EINVAL; in ep93xx_i2s_hw_params()
320 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in ep93xx_i2s_hw_params()
326 * EP93xx I2S module can be setup so SCLK / LRCLK value can be in ep93xx_i2s_hw_params()
330 * I2S standard permits us to transmit more bits than in ep93xx_i2s_hw_params()
333 div = clk_get_rate(info->mclk) / params_rate(params); in ep93xx_i2s_hw_params()
343 err = clk_set_rate(info->sclk, clk_get_rate(info->mclk) / sdiv); in ep93xx_i2s_hw_params()
347 err = clk_set_rate(info->lrclk, clk_get_rate(info->sclk) / lrdiv); in ep93xx_i2s_hw_params()
351 ep93xx_i2s_enable(info, substream->stream); in ep93xx_i2s_hw_params()
361 return -EINVAL; in ep93xx_i2s_set_sysclk()
363 return clk_set_rate(info->mclk, freq); in ep93xx_i2s_set_sysclk()
425 .name = "ep93xx-i2s",
435 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); in ep93xx_i2s_probe()
437 return -ENOMEM; in ep93xx_i2s_probe()
439 info->regs = devm_platform_ioremap_resource(pdev, 0); in ep93xx_i2s_probe()
440 if (IS_ERR(info->regs)) in ep93xx_i2s_probe()
441 return PTR_ERR(info->regs); in ep93xx_i2s_probe()
446 return irq < 0 ? irq : -ENODEV; in ep93xx_i2s_probe()
448 err = devm_request_irq(&pdev->dev, irq, ep93xx_i2s_interrupt, 0, in ep93xx_i2s_probe()
449 pdev->name, info); in ep93xx_i2s_probe()
454 info->mclk = clk_get(&pdev->dev, "mclk"); in ep93xx_i2s_probe()
455 if (IS_ERR(info->mclk)) { in ep93xx_i2s_probe()
456 err = PTR_ERR(info->mclk); in ep93xx_i2s_probe()
460 info->sclk = clk_get(&pdev->dev, "sclk"); in ep93xx_i2s_probe()
461 if (IS_ERR(info->sclk)) { in ep93xx_i2s_probe()
462 err = PTR_ERR(info->sclk); in ep93xx_i2s_probe()
466 info->lrclk = clk_get(&pdev->dev, "lrclk"); in ep93xx_i2s_probe()
467 if (IS_ERR(info->lrclk)) { in ep93xx_i2s_probe()
468 err = PTR_ERR(info->lrclk); in ep93xx_i2s_probe()
472 dev_set_drvdata(&pdev->dev, info); in ep93xx_i2s_probe()
474 err = devm_snd_soc_register_component(&pdev->dev, &ep93xx_i2s_component, in ep93xx_i2s_probe()
479 err = devm_ep93xx_pcm_platform_register(&pdev->dev); in ep93xx_i2s_probe()
486 clk_put(info->lrclk); in ep93xx_i2s_probe()
488 clk_put(info->sclk); in ep93xx_i2s_probe()
490 clk_put(info->mclk); in ep93xx_i2s_probe()
497 struct ep93xx_i2s_info *info = dev_get_drvdata(&pdev->dev); in ep93xx_i2s_remove()
499 clk_put(info->lrclk); in ep93xx_i2s_remove()
500 clk_put(info->sclk); in ep93xx_i2s_remove()
501 clk_put(info->mclk); in ep93xx_i2s_remove()
509 .name = "ep93xx-i2s",
515 MODULE_ALIAS("platform:ep93xx-i2s");
517 MODULE_DESCRIPTION("EP93XX I2S driver");