Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2bc5c937 authored by Iliya Varadzhakov's avatar Iliya Varadzhakov Committed by Gerrit - the friendly Code Review server
Browse files

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: default avatarIliya Varadzhakov <ivarad@codeaurora.org>
parent 59a631bc
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
/* 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;