diff options
author | Oder Chiou <oder_chiou@realtek.com> | 2018-09-17 07:03:09 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2018-09-17 13:48:40 -0400 |
commit | fbb673f7c6555d5434ad005f86b0d4368b1203d9 (patch) | |
tree | 6692149f4ce957c90723b9ba5f81d60fa79e4238 | |
parent | 75383f8d39d4c0fb96083dd460b7b139fbdac492 (diff) |
ASoC: rt5514-spi: Get the period_bytes in the copy work to make sure the value correctly
The value of period_bytes will get the zero before the hw_params() is not
run completely. Move the function snd_pcm_lib_period_bytes() to copy work,
and make sure that is not zero.
Signed-off-by: Oder Chiou <oder_chiou@realtek.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | sound/soc/codecs/rt5514-spi.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/sound/soc/codecs/rt5514-spi.c b/sound/soc/codecs/rt5514-spi.c index 18686ffb0cd5..13809821e1f8 100644 --- a/sound/soc/codecs/rt5514-spi.c +++ b/sound/soc/codecs/rt5514-spi.c | |||
@@ -91,6 +91,14 @@ static void rt5514_spi_copy_work(struct work_struct *work) | |||
91 | 91 | ||
92 | runtime = rt5514_dsp->substream->runtime; | 92 | runtime = rt5514_dsp->substream->runtime; |
93 | period_bytes = snd_pcm_lib_period_bytes(rt5514_dsp->substream); | 93 | period_bytes = snd_pcm_lib_period_bytes(rt5514_dsp->substream); |
94 | if (!period_bytes) { | ||
95 | schedule_delayed_work(&rt5514_dsp->copy_work, 5); | ||
96 | goto done; | ||
97 | } | ||
98 | |||
99 | if (rt5514_dsp->buf_size % period_bytes) | ||
100 | rt5514_dsp->buf_size = (rt5514_dsp->buf_size / period_bytes) * | ||
101 | period_bytes; | ||
94 | 102 | ||
95 | if (rt5514_dsp->get_size >= rt5514_dsp->buf_size) { | 103 | if (rt5514_dsp->get_size >= rt5514_dsp->buf_size) { |
96 | rt5514_spi_burst_read(RT5514_BUFFER_VOICE_WP, (u8 *)&buf, | 104 | rt5514_spi_burst_read(RT5514_BUFFER_VOICE_WP, (u8 *)&buf, |
@@ -149,13 +157,11 @@ done: | |||
149 | 157 | ||
150 | static void rt5514_schedule_copy(struct rt5514_dsp *rt5514_dsp) | 158 | static void rt5514_schedule_copy(struct rt5514_dsp *rt5514_dsp) |
151 | { | 159 | { |
152 | size_t period_bytes; | ||
153 | u8 buf[8]; | 160 | u8 buf[8]; |
154 | 161 | ||
155 | if (!rt5514_dsp->substream) | 162 | if (!rt5514_dsp->substream) |
156 | return; | 163 | return; |
157 | 164 | ||
158 | period_bytes = snd_pcm_lib_period_bytes(rt5514_dsp->substream); | ||
159 | rt5514_dsp->get_size = 0; | 165 | rt5514_dsp->get_size = 0; |
160 | 166 | ||
161 | /** | 167 | /** |
@@ -183,10 +189,6 @@ static void rt5514_schedule_copy(struct rt5514_dsp *rt5514_dsp) | |||
183 | 189 | ||
184 | rt5514_dsp->buf_size = rt5514_dsp->buf_limit - rt5514_dsp->buf_base; | 190 | rt5514_dsp->buf_size = rt5514_dsp->buf_limit - rt5514_dsp->buf_base; |
185 | 191 | ||
186 | if (rt5514_dsp->buf_size % period_bytes) | ||
187 | rt5514_dsp->buf_size = (rt5514_dsp->buf_size / period_bytes) * | ||
188 | period_bytes; | ||
189 | |||
190 | if (rt5514_dsp->buf_base && rt5514_dsp->buf_limit && | 192 | if (rt5514_dsp->buf_base && rt5514_dsp->buf_limit && |
191 | rt5514_dsp->buf_rp && rt5514_dsp->buf_size) | 193 | rt5514_dsp->buf_rp && rt5514_dsp->buf_size) |
192 | schedule_delayed_work(&rt5514_dsp->copy_work, 0); | 194 | schedule_delayed_work(&rt5514_dsp->copy_work, 0); |