summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmit Bhanagay <amitbhanagay@google.com>2023-02-14 21:42:02 +0000
committerAmit Bhanagay <amitbhanagay@google.com>2023-02-16 21:59:30 +0000
commit1112211944e42eb035f193ec5c1e1ce792800bf0 (patch)
tree7248373f18328d828473728ec9083b4165304ad8
parent34fe6bac73d68481e2d109e9c1f5c284a0420a4b (diff)
parent23c66d7b8284577568c3d3b6ebea90e05af9d35c (diff)
downloadrotary-encoders-1112211944e42eb035f193ec5c1e1ce792800bf0.tar.gz
Merge branch 'partner/android-msm-eos-5.4' into android13-msm-pixelwatch-5.15
Bug: 268415090 Signed-off-by: Amit Bhanagay <amitbhanagay@google.com> Change-Id: Ifb33fb155c94c986b3c8bb43e5faba3833b3d859
-rw-r--r--ots_pat9126/pat9126.c80
-rw-r--r--ots_pat9126/pat9126.h3
2 files changed, 58 insertions, 25 deletions
diff --git a/ots_pat9126/pat9126.c b/ots_pat9126/pat9126.c
index 9b1079c..01f005f 100644
--- a/ots_pat9126/pat9126.c
+++ b/ots_pat9126/pat9126.c
@@ -25,6 +25,9 @@
#include <linux/string.h>
#include <linux/soc/qcom/panel_event_notifier.h>
+#define WAKE_SENSITIVITY 1
+#define SENSITIVITY_LEN 4 /* range "0" - "255" */
+
struct pixart_pat9126_data {
struct i2c_client *client;
struct input_dev *input;
@@ -40,6 +43,7 @@ struct pixart_pat9126_data {
u32 vdd_sleep_load;
u32 vld_sleep_load;
int state;
+ u8 crown_sensitivity;
struct work_struct work;
struct workqueue_struct *workqueue;
struct delayed_work polling_work;
@@ -51,7 +55,7 @@ struct pixart_pat9126_data {
struct regulator *vld_supply;
};
-#define PAT9126_STATE_OFF 0
+#define PAT9126_STATE_SUSPEND 0
#define PAT9126_STATE_ON 1
#define PAT9126_STATE_RESUMING 2
@@ -178,7 +182,7 @@ static int pat9126_read(struct i2c_client *client, u8 addr, u8 *data)
};
if (i2c_transfer(client->adapter, msg, 2) != 2) {
- dev_err(dev, "%s Failed: writing to reg 0x%x\n", __func__,
+ dev_err(dev, "%s Failed: reading reg 0x%x\n", __func__,
addr);
return -EIO;
}
@@ -419,14 +423,8 @@ static void pat9126_work_handler(struct work_struct *work)
mutex_lock(&data->mtx);
- if (data->state != PAT9126_STATE_ON) {
- if (data->state == PAT9126_STATE_RESUMING) {
- pr_warn("[PAT9126] %s: work handler run before resume complete\n", __func__);
- } else {
- // PAT9126_STATE_OFF
- pr_warn("[PAT9126] %s: work handler run with device suspended\n", __func__);
- }
-
+ if (data->state == PAT9126_STATE_RESUMING) {
+ pr_warn("[PAT9126] %s: work handler run before resume complete\n", __func__);
goto end_work_handler;
}
@@ -473,19 +471,25 @@ static irqreturn_t pat9126_irq(int irq, void *dev_data)
return IRQ_HANDLED;
}
+static void pat9126_sensitivity_write(struct device *dev,
+ u8 sensitivity) {
+ struct pixart_pat9126_data *data =
+ (struct pixart_pat9126_data *) dev_get_drvdata(dev);
+ struct i2c_client *client = data->client;
+
+ pr_info("[PAT9126] set sensitivity: %d\n", sensitivity);
+ pat9126_write(client, PIXART_PAT9126_SET_CPI_RES_X_REG, sensitivity);
+}
+
static ssize_t pat9126_sensitivity_store(struct device *dev,
struct device_attribute *attr,
const char *buf,
size_t count) {
- u8 sensitivity;
-
struct pixart_pat9126_data *data =
(struct pixart_pat9126_data *) dev_get_drvdata(dev);
- struct i2c_client *client = data->client;
- if (!kstrtou8(buf, 0, &sensitivity)) {
- dev_dbg(dev, "RES_X: %d, 0x%x\n", sensitivity, sensitivity);
- pat9126_write(client, PIXART_PAT9126_SET_CPI_RES_X_REG, sensitivity);
+ if (!kstrtou8(buf, 0, &data->crown_sensitivity)) {
+ pat9126_sensitivity_write(dev, data->crown_sensitivity);
}
return count;
@@ -715,7 +719,6 @@ static void pat9126_complete_resume(struct work_struct *work) {
pat9126_enable_mot_write_protected(data->client);
data->state = PAT9126_STATE_ON;
- enable_irq(data->client->irq);
end_complete_resume:
mutex_unlock(&data->mtx);
@@ -956,6 +959,7 @@ static int pat9126_i2c_probe(struct i2c_client *client,
mutex_init(&data->mtx);
data->state = PAT9126_STATE_ON;
+ data->crown_sensitivity = PIXART_PAT9126_CPI_RESOLUTION_X;
ret = pat9126_register_panel_notifier(data);
if (ret) {
@@ -1046,7 +1050,7 @@ static int pat9126_display_suspend(struct device *dev)
pr_debug("[PAT9126] %s\n", __func__);
if(data->state != PAT9126_STATE_ON) {
- if (data->state == PAT9126_STATE_OFF) {
+ if (data->state == PAT9126_STATE_SUSPEND) {
pr_warn("[PAT9126] %s: Redundant call to suspend\n", __func__);
} else {
// PAT9126_STATE_RESUMING
@@ -1056,12 +1060,15 @@ static int pat9126_display_suspend(struct device *dev)
goto end_suspend;
}
- disable_irq(data->client->irq);
+ /* Set low sensitivity */
+ pat9126_sensitivity_write(dev, WAKE_SENSITIVITY);
+
+ enable_irq_wake(data->client->irq);
pat9126_disable_mot_write_protected(data->client);
pat9126_set_loads_sleep(data);
end_suspend:
- data->state = PAT9126_STATE_OFF;
+ data->state = PAT9126_STATE_SUSPEND;
mutex_unlock(&data->mtx);
return 0;
}
@@ -1074,13 +1081,16 @@ static int pat9126_display_resume(struct device *dev)
pr_debug("[PAT9126] %s\n", __func__);
mutex_lock(&data->mtx);
-
- if (data->state != PAT9126_STATE_OFF) {
+ if (data->state != PAT9126_STATE_SUSPEND) {
pr_warn("[PAT9126] %s: Redundant call to resume\n", __func__);
mutex_unlock(&data->mtx);
return 0;
}
+ /* Set regular sensitivity */
+ pat9126_sensitivity_write(dev, data->crown_sensitivity);
+
+ disable_irq_wake(data->client->irq);
data->state = PAT9126_STATE_RESUMING;
mutex_unlock(&data->mtx);
@@ -1095,12 +1105,37 @@ static int pat9126_display_resume(struct device *dev)
return 0;
}
+static int pat9126_pm_suspend(struct device *dev)
+{
+ struct pixart_pat9126_data *data =
+ (struct pixart_pat9126_data *) dev_get_drvdata(dev);
+
+ mutex_lock(&data->mtx);
+
+ return 0;
+}
+
+static int pat9126_pm_resume(struct device *dev)
+{
+ struct pixart_pat9126_data *data =
+ (struct pixart_pat9126_data *) dev_get_drvdata(dev);
+
+ mutex_unlock(&data->mtx);
+
+ return 0;
+}
+
static const struct i2c_device_id pat9126_device_id[] = {
{PAT9126_DEV_NAME, 0},
{}
};
MODULE_DEVICE_TABLE(i2c, pat9126_device_id);
+static const struct dev_pm_ops pat9126_pm_ops = {
+ .suspend = pat9126_pm_suspend,
+ .resume = pat9126_pm_resume
+};
+
static const struct of_device_id pixart_pat9126_match_table[] = {
{ .compatible = "pixart,pat9126",},
{ },
@@ -1110,6 +1145,7 @@ static struct i2c_driver pat9126_i2c_driver = {
.driver = {
.name = PAT9126_DEV_NAME,
.owner = THIS_MODULE,
+ .pm = &pat9126_pm_ops,
.of_match_table = pixart_pat9126_match_table,
},
.probe = pat9126_i2c_probe,
diff --git a/ots_pat9126/pat9126.h b/ots_pat9126/pat9126.h
index 72d8a7e..1b6b7d8 100644
--- a/ots_pat9126/pat9126.h
+++ b/ots_pat9126/pat9126.h
@@ -10,9 +10,6 @@
#define PAT9126_DEV_NAME "pixart_pat9126"
#define BUF_SIZE 2
#define RESET_DELAY_US 1000
-#define PINCTRL_STATE_ACTIVE "pmx_rot_switch_active"
-#define PINCTRL_STATE_SUSPEND "pmx_rot_switch_suspend"
-#define PINCTRL_STATE_RELEASE "pmx_rot_switch_release"
#define VDD_VTG_MIN_UV 1800000
#define VDD_VTG_MAX_UV 1800000
#define VDD_ACTIVE_LOAD_UA 10000