diff options
author | Subhransu S. Prusty <subhransu.s.prusty@intel.com> | 2016-04-12 01:01:23 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2016-04-12 01:05:55 -0400 |
commit | f0c8e1d9c4f473dfc771a613b602f1841afe8f8b (patch) | |
tree | 8d7fec8a67b74cab9a2d74563166119ab6d8d7d9 | |
parent | b8af8b1d80db13dd4f5e5a3698180bd9c14aee03 (diff) |
ASoC: Intel: Skylake: Fix ibs/obs calc for non-integral sampling rates
FW expects sampling rate rounded up to next higher integer value
when calculating ibs/obs. For example for 44.1k, it should be
rounded up to 45 to calculate ibs/obs.
Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | sound/soc/intel/skylake/skl-topology.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/sound/soc/intel/skylake/skl-topology.c b/sound/soc/intel/skylake/skl-topology.c index 5a85f3a4699b..cdb78b7e5a14 100644 --- a/sound/soc/intel/skylake/skl-topology.c +++ b/sound/soc/intel/skylake/skl-topology.c | |||
@@ -239,6 +239,7 @@ static void skl_tplg_update_buffer_size(struct skl_sst *ctx, | |||
239 | { | 239 | { |
240 | int multiplier = 1; | 240 | int multiplier = 1; |
241 | struct skl_module_fmt *in_fmt, *out_fmt; | 241 | struct skl_module_fmt *in_fmt, *out_fmt; |
242 | int in_rate, out_rate; | ||
242 | 243 | ||
243 | 244 | ||
244 | /* Since fixups is applied to pin 0 only, ibs, obs needs | 245 | /* Since fixups is applied to pin 0 only, ibs, obs needs |
@@ -249,15 +250,24 @@ static void skl_tplg_update_buffer_size(struct skl_sst *ctx, | |||
249 | 250 | ||
250 | if (mcfg->m_type == SKL_MODULE_TYPE_SRCINT) | 251 | if (mcfg->m_type == SKL_MODULE_TYPE_SRCINT) |
251 | multiplier = 5; | 252 | multiplier = 5; |
252 | mcfg->ibs = (in_fmt->s_freq / 1000) * | 253 | |
253 | (mcfg->in_fmt->channels) * | 254 | if (in_fmt->s_freq % 1000) |
254 | (mcfg->in_fmt->bit_depth >> 3) * | 255 | in_rate = (in_fmt->s_freq / 1000) + 1; |
255 | multiplier; | 256 | else |
256 | 257 | in_rate = (in_fmt->s_freq / 1000); | |
257 | mcfg->obs = (mcfg->out_fmt->s_freq / 1000) * | 258 | |
258 | (mcfg->out_fmt->channels) * | 259 | mcfg->ibs = in_rate * (mcfg->in_fmt->channels) * |
259 | (mcfg->out_fmt->bit_depth >> 3) * | 260 | (mcfg->in_fmt->bit_depth >> 3) * |
260 | multiplier; | 261 | multiplier; |
262 | |||
263 | if (mcfg->out_fmt->s_freq % 1000) | ||
264 | out_rate = (mcfg->out_fmt->s_freq / 1000) + 1; | ||
265 | else | ||
266 | out_rate = (mcfg->out_fmt->s_freq / 1000); | ||
267 | |||
268 | mcfg->obs = out_rate * (mcfg->out_fmt->channels) * | ||
269 | (mcfg->out_fmt->bit_depth >> 3) * | ||
270 | multiplier; | ||
261 | } | 271 | } |
262 | 272 | ||
263 | static int skl_tplg_update_be_blob(struct snd_soc_dapm_widget *w, | 273 | static int skl_tplg_update_be_blob(struct snd_soc_dapm_widget *w, |