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

Commit b0263913 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "qseecom: let kthread unload/unregister after qseecom_release"

parents df56e605 36dad800
Loading
Loading
Loading
Loading
+25 −20
Original line number Diff line number Diff line
@@ -3147,10 +3147,8 @@ static int qseecom_prepare_unload_app(struct qseecom_dev_handle *data)
	if (!entry)
		return -ENOMEM;
	entry->data = data;
	mutex_lock(&unload_app_pending_list_lock);
	list_add_tail(&entry->list,
		&qseecom.unload_app_pending_list_head);
	mutex_unlock(&unload_app_pending_list_lock);
	data->client.unload_pending = true;
	pr_debug("unload ta %d pending\n", data->client.app_id);
	return 0;
@@ -8258,12 +8256,33 @@ static int qseecom_open(struct inode *inode, struct file *file)
	return ret;
}

static void __qseecom_release_disable_clk(struct qseecom_dev_handle *data)
{
	if (qseecom.no_clock_support)
		return;
	if (qseecom.support_bus_scaling) {
		mutex_lock(&qsee_bw_mutex);
		if (data->mode != INACTIVE) {
			qseecom_unregister_bus_bandwidth_needs(data);
			if (qseecom.cumulative_mode == INACTIVE)
				__qseecom_set_msm_bus_request(INACTIVE);
		}
		mutex_unlock(&qsee_bw_mutex);
	} else {
		if (data->fast_load_enabled)
			qsee_disable_clock_vote(data, CLK_SFPB);
		if (data->perf_enabled)
			qsee_disable_clock_vote(data, CLK_DFAB);
	}
}

static int qseecom_release(struct inode *inode, struct file *file)
{
	struct qseecom_dev_handle *data = file->private_data;
	int ret = 0;
	bool free_private_data = true;

	__qseecom_release_disable_clk(data);
	if (!data->released) {
		pr_debug("data: released=false, type=%d, mode=%d, data=0x%pK\n",
			data->type, data->mode, data);
@@ -8275,13 +8294,17 @@ static int qseecom_release(struct inode *inode, struct file *file)
			ret = qseecom_unregister_listener(data);
			data->listener.release_called = true;
			mutex_unlock(&listener_access_lock);
			__wakeup_unregister_listener_kthread();
			break;
		case QSEECOM_CLIENT_APP:
			pr_debug("release app %d (%s)\n",
				data->client.app_id, data->client.app_name);
			if (data->client.app_id) {
				free_private_data = false;
				mutex_lock(&unload_app_pending_list_lock);
				ret = qseecom_prepare_unload_app(data);
				mutex_unlock(&unload_app_pending_list_lock);
				__wakeup_unload_app_kthread();
			}
			break;
		case QSEECOM_SECURE_SERVICE:
@@ -8300,24 +8323,6 @@ static int qseecom_release(struct inode *inode, struct file *file)
		}
	}

	if (qseecom.support_bus_scaling) {
		mutex_lock(&qsee_bw_mutex);
		if (data->mode != INACTIVE) {
			qseecom_unregister_bus_bandwidth_needs(data);
			if (qseecom.cumulative_mode == INACTIVE) {
				ret = __qseecom_set_msm_bus_request(INACTIVE);
				if (ret)
					pr_err("Fail to scale down bus\n");
			}
		}
		mutex_unlock(&qsee_bw_mutex);
	} else {
		if (data->fast_load_enabled)
			qsee_disable_clock_vote(data, CLK_SFPB);
		if (data->perf_enabled)
			qsee_disable_clock_vote(data, CLK_DFAB);
	}

	if (free_private_data) {
		__qseecom_free_tzbuf(&data->sglistinfo_shm);
		kfree(data);