msm:cci: Add protection for race condition in cci queue access
If two sensors are connected to the same CCI bus they start to write to this bus asynchronously. In some cases first sensor will start to write to the bus whle the second sensor call cci init function. Such race condition causes cci queue timeout To avoid such race condition cci init needs to be protected with queue mutexes. Change-Id: Ie8acf1c6543475a5b0b494c826d4af47573d0db3 Signed-off-by: Iliya Varadzhakov <ivarad@codeaurora.org>
This commit is contained in:
parent
59a631bcac
commit
2bc5c937f3
1 changed files with 9 additions and 1 deletions
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -1284,6 +1284,10 @@ static int32_t msm_cci_init(struct v4l2_subdev *sd,
|
|||
CDBG("%s:%d master %d\n", __func__, __LINE__, master);
|
||||
if (master < MASTER_MAX && master >= 0) {
|
||||
mutex_lock(&cci_dev->cci_master_info[master].mutex);
|
||||
mutex_lock(&cci_dev->cci_master_info[master].
|
||||
mutex_q[PRIORITY_QUEUE]);
|
||||
mutex_lock(&cci_dev->cci_master_info[master].
|
||||
mutex_q[SYNC_QUEUE]);
|
||||
flush_workqueue(cci_dev->write_wq[master]);
|
||||
/* Re-initialize the completion */
|
||||
reinit_completion(&cci_dev->
|
||||
|
@ -1308,6 +1312,10 @@ static int32_t msm_cci_init(struct v4l2_subdev *sd,
|
|||
if (rc <= 0)
|
||||
pr_err("%s:%d wait failed %d\n", __func__,
|
||||
__LINE__, rc);
|
||||
mutex_unlock(&cci_dev->cci_master_info[master].
|
||||
mutex_q[SYNC_QUEUE]);
|
||||
mutex_unlock(&cci_dev->cci_master_info[master].
|
||||
mutex_q[PRIORITY_QUEUE]);
|
||||
mutex_unlock(&cci_dev->cci_master_info[master].mutex);
|
||||
}
|
||||
return 0;
|
||||
|
|
Loading…
Add table
Reference in a new issue