ASoC: Intel: correct the fixed free block allocation
authorJie Yang <yang.jie@intel.com>
Tue, 23 Dec 2014 01:12:45 +0000 (09:12 +0800)
committerMark Brown <broonie@kernel.org>
Wed, 24 Dec 2014 12:14:06 +0000 (12:14 +0000)
For block span more than 1 section, when allocate it from
a free block, we need allocate the remain buffers within
the block, and then continue alloc the rest of needed
size buffer.

Here also make sure this free block is moved from free
list to used list, and add it to block_list which may
be used for power gating disabling later.

Signed-off-by: Jie Yang <yang.jie@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/sst-firmware.c

index 4a5bde9c686be2bbe967fcdd899f7c10f52a74c1..ef2e8b5766a1b92df8879541888b4761f1c2a09f 100644 (file)
@@ -763,8 +763,12 @@ static int block_alloc_fixed(struct sst_dsp *dsp, struct sst_block_allocator *ba
                /* does block span more than 1 section */
                if (ba->offset >= block->offset && ba->offset < block_end) {
 
+                       /* add block */
+                       list_move(&block->list, &dsp->used_block_list);
+                       list_add(&block->module_list, block_list);
                        /* align ba to block boundary */
-                       ba->offset = block->offset;
+                       ba->size -= block_end - ba->offset;
+                       ba->offset = block_end;
 
                        err = block_alloc_contiguous(dsp, ba, block_list);
                        if (err < 0)