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

Commit ed464bc7 authored by Sujeev Dias's avatar Sujeev Dias
Browse files

QBT1000: Enable runtime pm for qbt1000



FP authentication process spans multiple
command response from FP daemon.  During
this time system can go into suspend and
potentially delaying entire wake up process.
Add runtime pm so whenever qbt driver is
busy a wakeup_source is acquired.

Change-Id: I633f5c8703629b2e0ed822c837c162a29ed56fe8
Signed-off-by: default avatarSujeev Dias <sdias@codeaurora.org>
parent 2f2a03e6
Loading
Loading
Loading
Loading
+40 −3
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@
#include <linux/atomic.h>
#include <linux/of.h>
#include <linux/input.h>
#include <linux/pm_runtime.h>
#include <linux/pm_wakeup.h>
#include <uapi/linux/qbt1000.h>
#include <soc/qcom/scm.h>
#include "qseecom_kernel.h"
@@ -83,7 +85,9 @@ struct qbt1000_drvdata {
	uint32_t	ssc_subsys_id;
	uint32_t	ssc_spi_port;
	uint32_t	ssc_spi_port_slave_index;
	struct wakeup_source w_lock;
};
#define W_LOCK_DELAY_MS (2000)

/**
 * get_cmd_rsp_buffers() - Function sets cmd & rsp buffer pointers and
@@ -754,7 +758,7 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg)
	}

	drvdata = file->private_data;

	pm_runtime_get_sync(drvdata->dev);
	mutex_lock(&drvdata->mutex);
	if (((drvdata->sensor_conn_type == SPI) && (!drvdata->clock_state)) ||
	    ((drvdata->sensor_conn_type == SSC_SPI) && (!drvdata->ssc_state))) {
@@ -899,6 +903,8 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg)
	}

end:
	pm_runtime_mark_last_busy(drvdata->dev);
	pm_runtime_put_autosuspend(drvdata->dev);
	mutex_unlock(&drvdata->mutex);
	return rc;
}
@@ -1219,6 +1225,10 @@ static int qbt1000_probe(struct platform_device *pdev)
	atomic_set(&drvdata->available, 1);

	mutex_init(&drvdata->mutex);
	wakeup_source_init(&drvdata->w_lock, "qbt_wake_source");
	pm_runtime_set_autosuspend_delay(dev, W_LOCK_DELAY_MS);
	pm_runtime_use_autosuspend(dev);
	pm_runtime_enable(dev);

	rc = qbt1000_dev_register(drvdata);
	if (rc < 0)
@@ -1259,9 +1269,10 @@ static int qbt1000_remove(struct platform_device *pdev)
	return 0;
}

static int qbt1000_suspend(struct platform_device *pdev, pm_message_t state)
static int qbt1000_suspend(struct device *dev)
{
	int rc = 0;
	struct platform_device *pdev = to_platform_device(dev);
	struct qbt1000_drvdata *drvdata = platform_get_drvdata(pdev);

	/*
@@ -1280,18 +1291,44 @@ static int qbt1000_suspend(struct platform_device *pdev, pm_message_t state)
	return rc;
}

static int qbt1000_runtime_suspend(struct device *dev)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct qbt1000_drvdata *drvdata = platform_get_drvdata(pdev);

	__pm_relax(&drvdata->w_lock);

	return 0;
};

static int qbt1000_runtime_resume(struct device *dev)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct qbt1000_drvdata *drvdata = platform_get_drvdata(pdev);

	__pm_stay_awake(&drvdata->w_lock);

	return 0;
};

static struct of_device_id qbt1000_match[] = {
	{ .compatible = "qcom,qbt1000" },
	{}
};

static const struct dev_pm_ops qbt1000_dev_pm_ops = {
	SET_SYSTEM_SLEEP_PM_OPS(qbt1000_suspend, NULL)
	SET_RUNTIME_PM_OPS(qbt1000_runtime_suspend,
			   qbt1000_runtime_resume, NULL)
};

static struct platform_driver qbt1000_plat_driver = {
	.probe = qbt1000_probe,
	.remove = qbt1000_remove,
	.suspend = qbt1000_suspend,
	.driver = {
		.name = "qbt1000",
		.owner = THIS_MODULE,
		.pm = &qbt1000_dev_pm_ops,
		.of_match_table = qbt1000_match,
	},
};