Lines Matching +full:i2s +full:- +full:controller

1 // SPDX-License-Identifier: GPL-2.0
3 // Common functions for loongson I2S controller driver
13 #include <linux/dma-mapping.h>
33 struct loongson_i2s *i2s = snd_soc_dai_get_drvdata(dai); in loongson_i2s_trigger() local
41 mask = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? in loongson_i2s_trigger()
43 regmap_update_bits(i2s->regmap, LS_I2S_CTRL, mask, mask); in loongson_i2s_trigger()
48 mask = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? in loongson_i2s_trigger()
50 regmap_update_bits(i2s->regmap, LS_I2S_CTRL, mask, 0); in loongson_i2s_trigger()
53 ret = -EINVAL; in loongson_i2s_trigger()
63 struct loongson_i2s *i2s = snd_soc_dai_get_drvdata(dai); in loongson_i2s_hw_params() local
64 u32 clk_rate = i2s->clk_rate; in loongson_i2s_hw_params()
65 u32 sysclk = i2s->sysclk; in loongson_i2s_hw_params()
73 switch (i2s->rev_id) { in loongson_i2s_hw_params()
76 (bits * chans * fs * 2)) - 1; in loongson_i2s_hw_params()
77 mclk_ratio = DIV_ROUND_CLOSEST(clk_rate, (sysclk * 2)) - 1; in loongson_i2s_hw_params()
84 regmap_write(i2s->regmap, LS_I2S_CFG, val); in loongson_i2s_hw_params()
89 (bits * chans * fs * 2)) - 1; in loongson_i2s_hw_params()
92 sysclk) - (mclk_ratio << 16); in loongson_i2s_hw_params()
94 regmap_read(i2s->regmap, LS_I2S_CFG, &val); in loongson_i2s_hw_params()
97 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in loongson_i2s_hw_params()
101 regmap_write(i2s->regmap, LS_I2S_CFG, val); in loongson_i2s_hw_params()
104 regmap_write(i2s->regmap, LS_I2S_CFG1, val); in loongson_i2s_hw_params()
108 dev_err(i2s->dev, "I2S revision invalid\n"); in loongson_i2s_hw_params()
109 return -EINVAL; in loongson_i2s_hw_params()
118 struct loongson_i2s *i2s = snd_soc_dai_get_drvdata(dai); in loongson_i2s_set_dai_sysclk() local
120 i2s->sysclk = freq; in loongson_i2s_set_dai_sysclk()
125 static int loongson_i2s_enable_mclk(struct loongson_i2s *i2s) in loongson_i2s_enable_mclk() argument
129 if (i2s->rev_id == 0) in loongson_i2s_enable_mclk()
132 regmap_update_bits(i2s->regmap, LS_I2S_CTRL, in loongson_i2s_enable_mclk()
135 return regmap_read_poll_timeout_atomic(i2s->regmap, in loongson_i2s_enable_mclk()
142 static int loongson_i2s_enable_bclk(struct loongson_i2s *i2s) in loongson_i2s_enable_bclk() argument
146 if (i2s->rev_id == 0) in loongson_i2s_enable_bclk()
149 return regmap_read_poll_timeout_atomic(i2s->regmap, in loongson_i2s_enable_bclk()
158 struct loongson_i2s *i2s = snd_soc_dai_get_drvdata(dai); in loongson_i2s_set_fmt() local
165 regmap_update_bits(i2s->regmap, LS_I2S_CTRL, I2S_CTRL_MSB, in loongson_i2s_set_fmt()
169 return -EINVAL; in loongson_i2s_set_fmt()
178 regmap_update_bits(i2s->regmap, LS_I2S_CTRL, I2S_CTRL_MASTER, in loongson_i2s_set_fmt()
180 ret = loongson_i2s_enable_bclk(i2s); in loongson_i2s_set_fmt()
182 dev_warn(dai->dev, "wait BCLK ready timeout\n"); in loongson_i2s_set_fmt()
186 ret = loongson_i2s_enable_mclk(i2s); in loongson_i2s_set_fmt()
188 dev_warn(dai->dev, "wait MCLK ready timeout\n"); in loongson_i2s_set_fmt()
192 ret = loongson_i2s_enable_mclk(i2s); in loongson_i2s_set_fmt()
194 dev_warn(dai->dev, "wait MCLK ready timeout\n"); in loongson_i2s_set_fmt()
197 regmap_update_bits(i2s->regmap, LS_I2S_CTRL, I2S_CTRL_MASTER, in loongson_i2s_set_fmt()
200 ret = loongson_i2s_enable_bclk(i2s); in loongson_i2s_set_fmt()
202 dev_warn(dai->dev, "wait BCLK ready timeout\n"); in loongson_i2s_set_fmt()
205 return -EINVAL; in loongson_i2s_set_fmt()
213 struct loongson_i2s *i2s = dev_get_drvdata(cpu_dai->dev); in loongson_i2s_dai_probe() local
215 snd_soc_dai_init_dma_data(cpu_dai, &i2s->playback_dma_data, in loongson_i2s_dai_probe()
216 &i2s->capture_dma_data); in loongson_i2s_dai_probe()
217 snd_soc_dai_set_drvdata(cpu_dai, i2s); in loongson_i2s_dai_probe()
231 .name = "loongson-i2s",
233 .stream_name = "CPU-Playback",
240 .stream_name = "CPU-Capture",
253 struct loongson_i2s *i2s = dev_get_drvdata(dev); in i2s_suspend() local
255 regcache_cache_only(i2s->regmap, true); in i2s_suspend()
262 struct loongson_i2s *i2s = dev_get_drvdata(dev); in i2s_resume() local
264 regcache_cache_only(i2s->regmap, false); in i2s_resume()
265 regcache_mark_dirty(i2s->regmap); in i2s_resume()
266 return regcache_sync(i2s->regmap); in i2s_resume()
275 MODULE_DESCRIPTION("Common functions for loongson I2S controller driver");