diff options
author | Subhransu S. Prusty <subhransu.s.prusty@intel.com> | 2015-05-19 15:00:40 +0530 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-06-02 20:48:08 +0100 |
commit | 859c34bd3cabfc79106f9fcb5c55fb4af3eb3ce2 (patch) | |
tree | b85af4c0dba65b8244faa15b96e7535bfb1051f8 /sound/soc/intel/common/sst-ipc.c | |
parent | edd8ed496b98f1b9d9fda5170a90fe41e7f86e6e (diff) | |
download | linux-stable-859c34bd3cabfc79106f9fcb5c55fb4af3eb3ce2.tar.gz linux-stable-859c34bd3cabfc79106f9fcb5c55fb4af3eb3ce2.tar.bz2 linux-stable-859c34bd3cabfc79106f9fcb5c55fb4af3eb3ce2.zip |
ASoC: Intel: Allocate for the mailbox with max size
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>
Diffstat (limited to 'sound/soc/intel/common/sst-ipc.c')
-rw-r--r-- | sound/soc/intel/common/sst-ipc.c | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/sound/soc/intel/common/sst-ipc.c b/sound/soc/intel/common/sst-ipc.c index a7699f35a8d2..a12c7bb08d3b 100644 --- a/sound/soc/intel/common/sst-ipc.c +++ b/sound/soc/intel/common/sst-ipc.c @@ -129,11 +129,31 @@ static int msg_empty_list_init(struct sst_generic_ipc *ipc) return -ENOMEM; for (i = 0; i < IPC_EMPTY_LIST_SIZE; i++) { + ipc->msg[i].tx_data = kzalloc(ipc->tx_data_max_size, GFP_KERNEL); + if (ipc->msg[i].tx_data == NULL) + goto free_mem; + + ipc->msg[i].rx_data = kzalloc(ipc->rx_data_max_size, GFP_KERNEL); + if (ipc->msg[i].rx_data == NULL) { + kfree(ipc->msg[i].tx_data); + goto free_mem; + } + init_waitqueue_head(&ipc->msg[i].waitq); list_add(&ipc->msg[i].list, &ipc->empty_list); } return 0; + +free_mem: + while (i > 0) { + kfree(ipc->msg[i-1].tx_data); + kfree(ipc->msg[i-1].rx_data); + --i; + } + kfree(ipc->msg); + + return -ENOMEM; } static void ipc_tx_msgs(struct kthread_work *work) @@ -279,11 +299,18 @@ EXPORT_SYMBOL_GPL(sst_ipc_init); void sst_ipc_fini(struct sst_generic_ipc *ipc) { + int i; + if (ipc->tx_thread) kthread_stop(ipc->tx_thread); - if (ipc->msg) + if (ipc->msg) { + for (i = 0; i < IPC_EMPTY_LIST_SIZE; i++) { + kfree(ipc->msg[i].tx_data); + kfree(ipc->msg[i].rx_data); + } kfree(ipc->msg); + } } EXPORT_SYMBOL_GPL(sst_ipc_fini); |