From a339a7e2aa0c958c655f50ed2becc663269ac5b6 Mon Sep 17 00:00:00 2001 From: Pavan Chikkala Date: Wed, 12 Nov 2014 18:21:31 +0530 Subject: [PATCH] ASoC: Avoid wrong map/unmap of ocmem During cases of OCMEM GROW/SHRINK , there is a scope for map()/unmap() to be called continously.Added a check to avoid this error condition Change-Id: If13c9216d0c9daa1cddb22924708dd11f23e54e3 Signed-off-by: Pavan Chikkala --- sound/soc/msm/qdsp6v2/audio_ocmem.c | 94 +++++++++++++++-------------- 1 file changed, 50 insertions(+), 44 deletions(-) diff --git a/sound/soc/msm/qdsp6v2/audio_ocmem.c b/sound/soc/msm/qdsp6v2/audio_ocmem.c index 5be880dfc49..4f3137a7d96 100644 --- a/sound/soc/msm/qdsp6v2/audio_ocmem.c +++ b/sound/soc/msm/qdsp6v2/audio_ocmem.c @@ -362,59 +362,65 @@ int audio_ocmem_enable(int cid) case OCMEM_STATE_SHRINK: pr_debug("%s: ocmem shrink request process\n", __func__); - atomic_set(&audio_ocmem_lcl.audio_cond, 1); - clear_bit_pos(audio_ocmem_lcl.audio_state, - OCMEM_STATE_MAP_COMPL); - set_bit_pos(audio_ocmem_lcl.audio_state, - OCMEM_STATE_UNMAP_TRANSITION); - ret = ocmem_unmap(cid, audio_ocmem_lcl.buf, - &audio_ocmem_lcl.mlist); - if (ret) { - pr_err("%s: ocmem_unmap failed, state[%d]\n", - __func__, - atomic_read(&audio_ocmem_lcl.audio_state)); - goto fail_cmd1; - } + if (test_bit_pos(audio_ocmem_lcl.audio_state, + OCMEM_STATE_MAP_COMPL)) { + atomic_set(&audio_ocmem_lcl.audio_cond, 1); + clear_bit_pos(audio_ocmem_lcl.audio_state, + OCMEM_STATE_MAP_COMPL); + set_bit_pos(audio_ocmem_lcl.audio_state, + OCMEM_STATE_UNMAP_TRANSITION); + ret = ocmem_unmap(cid, audio_ocmem_lcl.buf, + &audio_ocmem_lcl.mlist); + if (ret) { + pr_err("%s: ocmem_unmap failed, state[%d]\n", + __func__, + atomic_read(&audio_ocmem_lcl.audio_state)); + goto fail_cmd1; + } - wait_event_interruptible(audio_ocmem_lcl.audio_wait, - (atomic_read(&audio_ocmem_lcl.audio_state) & - _UNMAP_RESPONSE_BIT_MASK_) - != 0); - ret = ocmem_shrink(cid, audio_ocmem_lcl.buf, 0); - if (ret) { - pr_err("%s: ocmem_shrink failed, state[%d]\n", - __func__, - atomic_read(&audio_ocmem_lcl.audio_state)); - goto fail_cmd1; - } - atomic_set(&audio_ocmem_lcl.audio_cond, 1); - clear_bit_pos(audio_ocmem_lcl.audio_state, + wait_event_interruptible(audio_ocmem_lcl.audio_wait, + (atomic_read(&audio_ocmem_lcl.audio_state) & + _UNMAP_RESPONSE_BIT_MASK_) + != 0); + ret = ocmem_shrink(cid, audio_ocmem_lcl.buf, 0); + if (ret) { + pr_err("%s: ocmem_shrink failed, state[%d]\n", + __func__, + atomic_read(&audio_ocmem_lcl.audio_state)); + goto fail_cmd1; + } + atomic_set(&audio_ocmem_lcl.audio_cond, 1); + clear_bit_pos(audio_ocmem_lcl.audio_state, OCMEM_STATE_SHRINK); + } pr_debug("%s:shrink process complete\n", __func__); break; case OCMEM_STATE_GROW: pr_debug("%s: ocmem grow request process\n", __func__); - atomic_set(&audio_ocmem_lcl.audio_cond, 1); - clear_bit_pos(audio_ocmem_lcl.audio_state, - OCMEM_STATE_UNMAP_COMPL); - set_bit_pos(audio_ocmem_lcl.audio_state, - OCMEM_STATE_MAP_TRANSITION); - ret = ocmem_map(cid, audio_ocmem_lcl.buf, + if (test_bit_pos(audio_ocmem_lcl.audio_state, + OCMEM_STATE_UNMAP_COMPL)) { + atomic_set(&audio_ocmem_lcl.audio_cond, 1); + clear_bit_pos(audio_ocmem_lcl.audio_state, + OCMEM_STATE_UNMAP_COMPL); + set_bit_pos(audio_ocmem_lcl.audio_state, + OCMEM_STATE_MAP_TRANSITION); + ret = ocmem_map(cid, audio_ocmem_lcl.buf, &audio_ocmem_lcl.mlist); - if (ret) { - pr_err("%s: ocmem_map failed, state[%d]\n", - __func__, - atomic_read(&audio_ocmem_lcl.audio_state)); - goto fail_cmd1; - } - wait_event_interruptible(audio_ocmem_lcl.audio_wait, - (atomic_read(&audio_ocmem_lcl.audio_state) & - _MAP_RESPONSE_BIT_MASK_) != 0); + if (ret) { + pr_err("%s: ocmem_map failed, state[%d]\n", + __func__, + atomic_read(&audio_ocmem_lcl.audio_state)); + goto fail_cmd1; + } + wait_event_interruptible(audio_ocmem_lcl.audio_wait, + (atomic_read(&audio_ocmem_lcl.audio_state) & + _MAP_RESPONSE_BIT_MASK_) != 0); - clear_bit_pos(audio_ocmem_lcl.audio_state, - OCMEM_STATE_GROW); - atomic_set(&audio_ocmem_lcl.audio_cond, 1); + clear_bit_pos(audio_ocmem_lcl.audio_state, + OCMEM_STATE_GROW); + atomic_set(&audio_ocmem_lcl.audio_cond, 1); + } break; case OCMEM_STATE_EXIT: if (test_bit_pos(audio_ocmem_lcl.audio_state,