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

Commit e64955f9 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "qseecom: Improve qseecom driver state management"

parents 20ea2f65 3d8d0d65
Loading
Loading
Loading
Loading
+21 −10
Original line number Original line Diff line number Diff line
@@ -90,6 +90,10 @@


#define PHY_ADDR_4G	(1ULL<<32)
#define PHY_ADDR_4G	(1ULL<<32)


#define QSEECOM_STATE_NOT_READY         0
#define QSEECOM_STATE_SUSPEND           1
#define QSEECOM_STATE_READY             2

/*
/*
 * default ce info unit to 0 for
 * default ce info unit to 0 for
 * services which
 * services which
@@ -227,7 +231,7 @@ struct qseecom_control {


	uint32_t app_block_ref_cnt;
	uint32_t app_block_ref_cnt;
	wait_queue_head_t app_block_wq;
	wait_queue_head_t app_block_wq;
	atomic_t in_suspend;  /* 1: in suspend; 0: not in suspend*/
	atomic_t qseecom_state;
};
};


struct qseecom_sec_buf_fd_info {
struct qseecom_sec_buf_fd_info {
@@ -3701,8 +3705,9 @@ int qseecom_start_app(struct qseecom_handle **handle,
	ion_phys_addr_t pa;
	ion_phys_addr_t pa;
	uint32_t fw_size, app_arch;
	uint32_t fw_size, app_arch;


	if (atomic_read(&qseecom.in_suspend) == 1) {
	if (atomic_read(&qseecom.qseecom_state) != QSEECOM_STATE_READY) {
		pr_err("Not allowed to be called in suspend state\n");
		pr_err("Not allowed to be called in %d state\n",
				atomic_read(&qseecom.qseecom_state));
		return -EPERM;
		return -EPERM;
	}
	}
	if (!app_name) {
	if (!app_name) {
@@ -3859,10 +3864,12 @@ int qseecom_shutdown_app(struct qseecom_handle **handle)
	unsigned long flags = 0;
	unsigned long flags = 0;
	bool found_handle = false;
	bool found_handle = false;


	if (atomic_read(&qseecom.in_suspend) == 1) {
	if (atomic_read(&qseecom.qseecom_state) != QSEECOM_STATE_READY) {
		pr_err("Not allowed to be called in suspend state\n");
		pr_err("Not allowed to be called in %d state\n",
				atomic_read(&qseecom.qseecom_state));
		return -EPERM;
		return -EPERM;
	}
	}

	if ((handle == NULL)  || (*handle == NULL)) {
	if ((handle == NULL)  || (*handle == NULL)) {
		pr_err("Handle is not initialized\n");
		pr_err("Handle is not initialized\n");
		return -EINVAL;
		return -EINVAL;
@@ -3925,10 +3932,12 @@ int qseecom_send_command(struct qseecom_handle *handle, void *send_buf,
	struct qseecom_dev_handle *data;
	struct qseecom_dev_handle *data;
	bool perf_enabled = false;
	bool perf_enabled = false;


	if (atomic_read(&qseecom.in_suspend) == 1) {
	if (atomic_read(&qseecom.qseecom_state) != QSEECOM_STATE_READY) {
		pr_err("Not allowed to be called in suspend state\n");
		pr_err("Not allowed to be called in %d state\n",
				atomic_read(&qseecom.qseecom_state));
		return -EPERM;
		return -EPERM;
	}
	}

	if (handle == NULL) {
	if (handle == NULL) {
		pr_err("Handle is not initialized\n");
		pr_err("Handle is not initialized\n");
		return -EINVAL;
		return -EINVAL;
@@ -7528,7 +7537,7 @@ static int qseecom_probe(struct platform_device *pdev)
	qseecom.ce_drv.ce_clk = NULL;
	qseecom.ce_drv.ce_clk = NULL;
	qseecom.ce_drv.ce_core_src_clk = NULL;
	qseecom.ce_drv.ce_core_src_clk = NULL;
	qseecom.ce_drv.ce_bus_clk = NULL;
	qseecom.ce_drv.ce_bus_clk = NULL;
	atomic_set(&qseecom.in_suspend, 0);
	atomic_set(&qseecom.qseecom_state, QSEECOM_STATE_NOT_READY);


	qseecom.app_block_ref_cnt = 0;
	qseecom.app_block_ref_cnt = 0;
	init_waitqueue_head(&qseecom.app_block_wq);
	init_waitqueue_head(&qseecom.app_block_wq);
@@ -7743,6 +7752,7 @@ static int qseecom_probe(struct platform_device *pdev)
	if (!qseecom.qsee_perf_client)
	if (!qseecom.qsee_perf_client)
		pr_err("Unable to register bus client\n");
		pr_err("Unable to register bus client\n");


	atomic_set(&qseecom.qseecom_state, QSEECOM_STATE_READY);
	return 0;
	return 0;


exit_destroy_ion_client:
exit_destroy_ion_client:
@@ -7767,6 +7777,7 @@ static int qseecom_remove(struct platform_device *pdev)
	struct qseecom_ce_pipe_entry *pce_entry;
	struct qseecom_ce_pipe_entry *pce_entry;
	struct qseecom_ce_info_use *pce_info_use;
	struct qseecom_ce_info_use *pce_info_use;


	atomic_set(&qseecom.qseecom_state, QSEECOM_STATE_NOT_READY);
	spin_lock_irqsave(&qseecom.registered_kclient_list_lock, flags);
	spin_lock_irqsave(&qseecom.registered_kclient_list_lock, flags);


	list_for_each_entry(kclient, &qseecom.registered_kclient_list_head,
	list_for_each_entry(kclient, &qseecom.registered_kclient_list_head,
@@ -7859,7 +7870,7 @@ static int qseecom_suspend(struct platform_device *pdev, pm_message_t state)
	struct qseecom_clk *qclk;
	struct qseecom_clk *qclk;
	qclk = &qseecom.qsee;
	qclk = &qseecom.qsee;


	atomic_set(&qseecom.in_suspend, 1);
	atomic_set(&qseecom.qseecom_state, QSEECOM_STATE_SUSPEND);
	if (qseecom.no_clock_support)
	if (qseecom.no_clock_support)
		return 0;
		return 0;


@@ -7970,7 +7981,7 @@ err:
	mutex_unlock(&qsee_bw_mutex);
	mutex_unlock(&qsee_bw_mutex);
	ret = -EIO;
	ret = -EIO;
exit:
exit:
	atomic_set(&qseecom.in_suspend, 0);
	atomic_set(&qseecom.qseecom_state, QSEECOM_STATE_READY);
	return ret;
	return ret;
}
}
static struct of_device_id qseecom_match[] = {
static struct of_device_id qseecom_match[] = {