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

Commit dd634e61 authored by Himanshu Aggarwal's avatar Himanshu Aggarwal Committed by Gerrit - the friendly Code Review server
Browse files

input: synaptics_i2c_rmi4: synchronize access to support_fn_list



Synchronize access to support_fn_list to avoid race conditions.

This patch is propagated from msm-3.10 kernel
(commit: bda3d93d0c5b793c30dcfb2d17573f98e3d21973
input: synaptics_i2c_rmi4: synchronize access to support_fn_list)
Also cleaned checkpatch warning on msm-3.18 kernel.

Change-Id: I13b8e99f0c4914046c745b0232a9ce3f792bba47
Signed-off-by: default avatarHimanshu Aggarwal <haggarwa@codeaurora.org>
Signed-off-by: default avatarSudhakar Manapati <smanap@codeaurora.org>
parent 9ae48bfb
Loading
Loading
Loading
Loading
+30 −7
Original line number Diff line number Diff line
@@ -607,6 +607,7 @@ static ssize_t synaptics_rmi4_0dbutton_store(struct device *dev,
	if (rmi4_data->button_0d_enabled == input)
		return count;

	mutex_lock(&rmi->support_fn_list_mutex);
	if (!list_empty(&rmi->support_fn_list)) {
		list_for_each_entry(fhandler, &rmi->support_fn_list, link) {
			if (fhandler->fn_number == SYNAPTICS_RMI4_F1A) {
@@ -618,7 +619,7 @@ static ssize_t synaptics_rmi4_0dbutton_store(struct device *dev,
						&intr_enable,
						sizeof(intr_enable));
				if (retval < 0)
					return retval;
					goto exit;

				if (input == 1)
					intr_enable |= fhandler->intr_mask;
@@ -631,14 +632,17 @@ static ssize_t synaptics_rmi4_0dbutton_store(struct device *dev,
						&intr_enable,
						sizeof(intr_enable));
				if (retval < 0)
					return retval;
					goto exit;
			}
		}
	}

	mutex_unlock(&rmi->support_fn_list_mutex);
	rmi4_data->button_0d_enabled = input;

	return count;
exit:
	mutex_unlock(&rmi->support_fn_list_mutex);
	return retval;
}

static ssize_t synaptics_rmi4_flipx_show(struct device *dev,
@@ -1309,6 +1313,7 @@ static int synaptics_rmi4_sensor_report(struct synaptics_rmi4_data *rmi4_data)
	 * Traverse the function handler list and service the source(s)
	 * of the interrupt accordingly.
	 */
	mutex_lock(&rmi->support_fn_list_mutex);
	if (!list_empty(&rmi->support_fn_list)) {
		list_for_each_entry(fhandler, &rmi->support_fn_list, link) {
			if (fhandler->num_of_data_sources) {
@@ -1320,6 +1325,7 @@ static int synaptics_rmi4_sensor_report(struct synaptics_rmi4_data *rmi4_data)
			}
		}
	}
	mutex_unlock(&rmi->support_fn_list_mutex);

	mutex_lock(&exp_fn_list_mutex);
	if (!list_empty(&exp_fn_list)) {
@@ -2051,10 +2057,12 @@ static int synaptics_rmi4_check_fn_list(struct synaptics_rmi4_data *rmi4_data,

	rmi = &(rmi4_data->rmi4_mod_info);

	mutex_lock(&rmi->support_fn_list_mutex);
	if (!list_empty(&rmi->support_fn_list))
		list_for_each_entry(new_fhandler, &rmi->support_fn_list, link)
			if (new_fhandler->fn_number == fhandler->fn_number)
				found = 1;
	mutex_unlock(&rmi->support_fn_list_mutex);

	return found;
}
@@ -2232,8 +2240,11 @@ static int synaptics_rmi4_query_device(struct synaptics_rmi4_data *rmi4_data)
						fhandler);

				if (!found) {
					mutex_lock(&rmi->support_fn_list_mutex);
					list_add_tail(&fhandler->link,
							&rmi->support_fn_list);
					mutex_unlock(
						&rmi->support_fn_list_mutex);
				} else {
					if (fhandler->fn_number ==
							SYNAPTICS_RMI4_F1A) {
@@ -2261,21 +2272,26 @@ flash_prog_mode:
	 * Map out the interrupt bit masks for the interrupt sources
	 * from the registered function handlers.
	 */
	mutex_lock(&rmi->support_fn_list_mutex);
	if (!list_empty(&rmi->support_fn_list)) {
		list_for_each_entry(fhandler, &rmi->support_fn_list, link)
			data_sources += fhandler->num_of_data_sources;
	}
	mutex_unlock(&rmi->support_fn_list_mutex);

	if (data_sources) {
		mutex_lock(&rmi->support_fn_list_mutex);
		if (!list_empty(&rmi->support_fn_list)) {
			list_for_each_entry(fhandler,
						&rmi->support_fn_list, link) {
				if (fhandler->num_of_data_sources) {
					rmi4_data->intr_mask
						[fhandler->intr_reg_num] |=
					rmi4_data->intr_mask[fhandler->
						intr_reg_num] |=
						fhandler->intr_mask;
				}
			}
		}
		mutex_unlock(&rmi->support_fn_list_mutex);
	}

	/* Enable the interrupt sources */
@@ -2872,6 +2888,7 @@ static int synaptics_rmi4_probe(struct i2c_client *client,
	mutex_init(&(rmi4_data->rmi4_io_ctrl_mutex));

	INIT_LIST_HEAD(&rmi->support_fn_list);
	mutex_init(&rmi->support_fn_list_mutex);

	retval = synaptics_rmi4_query_device(rmi4_data);
	if (retval < 0) {
@@ -2926,12 +2943,14 @@ static int synaptics_rmi4_probe(struct i2c_client *client,
	i2c_set_clientdata(client, rmi4_data);

	f1a = NULL;
	mutex_lock(&rmi->support_fn_list_mutex);
	if (!list_empty(&rmi->support_fn_list)) {
		list_for_each_entry(fhandler, &rmi->support_fn_list, link) {
			if (fhandler->fn_number == SYNAPTICS_RMI4_F1A)
				f1a = fhandler->data;
		}
	}
	mutex_unlock(&rmi->support_fn_list_mutex);

	if (f1a) {
		for (ii = 0; ii < f1a->valid_button_count; ii++) {
@@ -3044,6 +3063,7 @@ err_enable_irq:
	input_unregister_device(rmi4_data->input_dev);

err_register_input:
	mutex_lock(&rmi->support_fn_list_mutex);
	if (!list_empty(&rmi->support_fn_list)) {
		list_for_each_entry_safe(fhandler, next_fhandler,
					&rmi->support_fn_list, link) {
@@ -3056,6 +3076,7 @@ err_register_input:
			kfree(fhandler);
		}
	}
	mutex_unlock(&rmi->support_fn_list_mutex);
err_free_gpios:
	if (gpio_is_valid(rmi4_data->board->reset_gpio))
		gpio_free(rmi4_data->board->reset_gpio);
@@ -3111,6 +3132,7 @@ static int synaptics_rmi4_remove(struct i2c_client *client)

	input_unregister_device(rmi4_data->input_dev);

	mutex_lock(&rmi->support_fn_list_mutex);
	if (!list_empty(&rmi->support_fn_list)) {
		list_for_each_entry_safe(fhandler, next_fhandler,
					&rmi->support_fn_list, link) {
@@ -3123,6 +3145,7 @@ static int synaptics_rmi4_remove(struct i2c_client *client)
			kfree(fhandler);
		}
	}
	mutex_unlock(&rmi->support_fn_list_mutex);

	if (gpio_is_valid(rmi4_data->board->reset_gpio))
		gpio_free(rmi4_data->board->reset_gpio);
+1 −0
Original line number Diff line number Diff line
@@ -161,6 +161,7 @@ struct synaptics_rmi4_device_info {
	unsigned char product_id_string[SYNAPTICS_RMI4_PRODUCT_ID_SIZE + 1];
	unsigned char build_id[SYNAPTICS_RMI4_BUILD_ID_SIZE];
	unsigned char config_id[3];
	struct mutex support_fn_list_mutex;
	struct list_head support_fn_list;
};