|
@@ -550,6 +550,13 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
|
|
|
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
|
|
u32 *buf = (u32 *)(runtime->dma_area +
|
|
|
rsnd_dai_pointer_offset(io, 0));
|
|
|
+ int shift = 0;
|
|
|
+
|
|
|
+ switch (runtime->sample_bits) {
|
|
|
+ case 32:
|
|
|
+ shift = 8;
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* 8/16/32 data can be assesse to TDR/RDR register
|
|
@@ -557,9 +564,9 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
|
|
|
* see rsnd_ssi_init()
|
|
|
*/
|
|
|
if (rsnd_io_is_play(io))
|
|
|
- rsnd_mod_write(mod, SSITDR, *buf);
|
|
|
+ rsnd_mod_write(mod, SSITDR, (*buf) << shift);
|
|
|
else
|
|
|
- *buf = rsnd_mod_read(mod, SSIRDR);
|
|
|
+ *buf = (rsnd_mod_read(mod, SSIRDR) >> shift);
|
|
|
|
|
|
elapsed = rsnd_dai_pointer_update(io, sizeof(*buf));
|
|
|
}
|